[RESOLVIDO]Mais de uma ação Getters e Setters?

24 respostas
rebinho

Galera estou estudando conceitos básicos de OO ta dureza mas esta indo rsrs
Estou fazendo alguns projetinhos para fixar melhor os conhecimentos, aí me surgiu uma dúvida...
Um método Get ou Set pode ter mais de uma ação? Quando digo mais de uma ação não é somente validar o dado recebido e atribuir. E sim fazer outro tipo de ação ou tratar mais de um atributo por método? Isso está dentro do padrão? É certo?

Um exemplo pra explicar melhor:
class exemplo{
     String nome;
     String sobrenome;
     int idade;
     double salario;

//SET
     public void setAtribuiValores(String nome, String sobrenome, int idade, double salario){
            this.nome = nome;
            this.sobrenome = sobrenome;
            this.idade = idade;
            this.salario = salario;
     }//Isso é permitido? Uso o set no nome do método? Ou só quando se trata de apenas um atributo?

//GET
     public void getMostra(){
//Somente retornar um atributo é função dos métodos get? Ou poderia usar para exibir mensagem etc...?
            System.out.println("Nome: "+nome);
            System.out.println("Sobrenome: "+sobrenome);
            System.out.println("Idade: "+idade);
            System.out.println("Salário: "+salario);
     }


//Pelos exemplos que vejo o correto seria apenas dessa forma abaixo:

//SET
     public void setAtribuiNome(String nome){
            this.nome = nome;
     }
     public void setAtribuiSobrenome(String sobrenome){
            this.nome = sobrenome;
     }

//GET
     public String setMostraNome(){
            return this.nome;
     }
     public void setMostraSobrenome(){
            return this.sobrenome;
     }

}
Quanto a Encapsulamento e etc dei uma estudada em alguns livros pra não acessar diretamente, mais segurança, evitar dados inválidos....... O conceito em si eu entendi, mais pode ou não ter várias ações em um método e nomear como GET/SET?

Valeu, Abraço!

24 Respostas

acnazarejr

De acordo com a forma canônica os metódos getters e setters tem a função de manipular os atributos privados de uma classe. Eles apenas modificam o valor de um atributo (set) ou retornam o seu valor (get).

Porém nada o impede de criar novos setters e getters para atender suas necessidades. Dede que os básicos não façam nada mais que atribuir e retornar.

Assim você poderia ter os métodos da sua classe, acrescido dos básicos, como abaixo:

public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public double getSalario() {
		return salario;
	}

	public void setSalario(double salario) {
		this.salario = salario;
	}

Espero ter ajudado

L

Cara eu fiz uma manual bem básico, de get e setters pra apresentar numa mini palestra

dá uma olhadinha!

fbfarias

Pois é…
Como disse o amigo anterior, o padrão é um set e um get para cada atributo.
Até IDEs consagradas como Netbeans utilizam desta forma: quando você vai encapsular campos ele cria um set e um get para cada atributo.

Flavio_machine

O métodos foram criados para colocar lógica dentro deles não importado qual seja, se vai acessar outros atributos se vai fazer cálculos …
Se não fosse por isso não existiria a razão de eles existirem. Seria mais fácil e limpo acessar os atributos diretamente da classe.
A justificativa de você sempre fazer esse métodos, “mesmo sem lógica” , e que futuramente você pode querer alterar a classe e não vai ter que mudar no sistema inteiro.
Colocando a lógica nesses métodos a até criando novos, como esse abaixo, várias partes da aplicação poderão acessá-los, e você facilmente reutilizará a camada model em outras aplicações.

public int soma(){
   return atributoA + atributoB;

  }
drsmachado

Mas isto vai contra determinadas convenções.
Afinal, classes podem ser criadas com nomes sómente letras minúsculas, mas a convenção diz que não se deve fazer isto. Métodos podem ser criados com nome começando com maiúscula, mas a convenção diz que não se deve fazer isto.

Se você precisa colocar lógica num setter é por que alguma coisa está diferente do correto. Entendo que

public String setNome(String nome){
 this.nome = nome;
}

deve receber o resultado das manipulações anteriores ao produto final que será passado como parâmetro.

E, se

public int getSoma(){
  return 1 + 1;
}

for criado, é um erro. Afinal, classes podem e devem ter variáveis. Por convenção, estas devem ser privates e a forma de acessá-las é pelos getters e setters. Além do que, o custo para fazer isto ou para criar a variável, um método doSoma() e o retorno é praticamente o mesmo.
Entendo que esses “atalhos” são pura e simplesmente, preguiça.
Sugiro pesquisar mais sobre OO, afinal, se uma mesma classe pode fazer tudo num único método, para que então abstrair e encapsular, manter coesão e coisas assim, não é mesmo?

Lembrem-se, não estamos mais competindo por bits, nem programando proceduralmente…

Flavio_machine

Vichi maria, cada uma eim.
Sobre estudar sou certificado SCJP e SCWCD, no momento estou me preparando para EJB.
Oque tem haver a convenção CamelCase, com colocar ou não lógica ou usar vários atributos dentro do método ?

public String setNome(String nome){  
    this.nome = nome;  
    }

De uma olhada nesse método em que vc precisa salvar no banco sempre com letras maiúsculas vc simplesmente altera isso no método setter e toda a sua aplicação vai compartilhar essa alteração, e ainda você poderá utilizar essa classe em outros projetos.

private String nome;
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome.toUpperCase();
    }
thiagocg

No blog da caelum tem um post muito interessante sobre getters e setters, recomendo a leitura.

http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/

[]'s

drsmachado

Se você leu direito, percebe que não é a questão de upperCase para salvar e, sim, qual a estética das classes.
Aliás, convenções são cobradas desde a OCJP, não são?

Ou, para o seu projeto do EJB você vai usar os beans com um setter ou getter assim

public Long setValor(Long valor){ if(valor > 30){ this.valor = valor*10/100; }else{ this.valor = valor / 3 * 43 + (34*27); } } ?

Eu, sinceramente, não faria isso…

drsmachado

thiagocg:
No blog da caelum tem um post muito interessante sobre getters e setters, recomendo a leitura.

http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/

[]'s

Sem mais…
Por isso que o mercado está tão ruim assim, “profissionais” não sabem fazer um getter ou setter…

kritiuns

Uma vez fiz um getter assim:

public int getTamanhoTabela(){
   int retorno = 0;
   if(lista.size == 1){
     retorno = 400; 
   }else{
     retorno = 200;
   }  

   return retorno; 
}

isso em um projeto JSF

então na tabela eu só chamava o atributo tamanhoTabela ele chamava o get e já resolvia o meu problema …

deveria eu criar um método diferente que manipula isso e tirar a lógica do get ??

drsmachado

kritinus, isso não é uma regra ou uma definição da linguagem.
Mas, meio que empiricamente, se tornou uma convenção.
Vai de você perceber o quanto poluído isso torna o código.
Particularmente, eu entendo que um get só “pega” valor e um set apenas “atribui” um valor.
Se fosse para ter lógica, o nome do método seria outro.
Pense no boolean…

public boolean isOk(){
 if(ok){
  return true;
 }else{
  return false;
}

Parece lógico isso?

kritiuns

Entendi perfeitamente agora hehe …

e vou mudar o meu codigo então :stuck_out_tongue:

public int calculaTamanhoTabela(){
  //bla bla bla 
}

Vlw drsmachado

Mateus_Avelar

Faz Assim: :)

public int getTamanhoTabela(){  

  //bla bla bla   

return resultadodoblablabla;
}
drsmachado
Mateus_Avelar:
Faz Assim: :)
public int getTamanhoTabela(){  

  //bla bla bla   

return resultadodoblablabla;
}
E se for pra verificar se a tabela está nula
public boolean isTabelaNula(){
  if(tamanhoTabela == null){
   return true;
  }else if(tamanhoTabela != null){
   return false;
  }
}
Seguindo a lógica...
kritiuns
Mateus_Avelar:
Faz Assim: :)
public int getTamanhoTabela(){  

  //bla bla bla   

return resultadodoblablabla;
}

^.^ relaxa o return tava no meu bla bla bla já

Mateus_Avelar

Ahhh soh… :lol:

ficou alguma duvida?

kritiuns

O tópico não é meu só levantei uma duvida próxima o da pessoa q postou …

ViniGodoy

Essa convenção surgiu com a especificação dos JavaBeans:
http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html

Lá descreve a regra dos getters e setters, disparo de eventos, gets e sets com índices, etc. Isso veio de uma época que não existiam muitos recursos de anotações, e uma IDE seria obrigada a conhecer um prefixo no nome do método, para saber que ele tinha um papel especial. O prefixo eleito foi “get”, para se obter um valor de um atributo e “set” para altera-lo.

A convenção se popularizou, embora o objetivo inicial do Java Beans, que era de permitir componentes plugáveis em navegadores, não tenha sido atingido da maneira esperada. Hoje, há mecanismos melhores do que getters e setters para especificação de componentes, entre eles, o uso de anotações, como faz o Hibernate e o JUnit.

Agora, mesmo a especificação do javabean não impedia você de ter outros tipos de métodos, sejam eles getters ou não. A única coisa que aconteceria, é que esses métodos não seriam encarados como atributos (ou seja, não apareceriam em barras de componente editáveis, como a do editor de GUI do Netbeans). Inclusive, não é incomum achar classes com setters mais complexos. Existem exemplos até no java: A classe point, tem o método setLocation acentando tanto x quanto o y e todos os componentes de tela tem o método setBounds, que aceitam 4 parâmetros (x, y, w e h). Também não é incomum achar propriedades que não sigam essas regras, como a propriedade size() (e não getSize()) da classe List.

ViniGodoy

Só um comentário. As primeiras versões do JUnit também seguiram a linha do JavaBeans, mas no lugar de get, os métodos de teste deveriam iniciar com a palavra “test”. Desde o JUnit 4, JUnit abandonou essa prática graças aos annotations, que permitem que você marque o método com a anotação @Test.

Entretanto, ainda é comum ver gente chamando o método de test, e ver IDEs que usam esse prefixo, mesmo com as versões novas sendo utilizadas.

rebinho

acnazarejr entendi os exemplos brother… Valeu pela força

fbfarias entendi mano só acho que uma classe com muitos atributos vai ficar foda criar um get e um set pra cada mano!

Flavio machine também não tinha entendido direito

O métodos foram criados para colocar lógica dentro deles não importado qual seja, se vai acessar outros atributos se vai fazer cálculos …
não sei se a interpretação que foi errada, mais tinha achado meio estranho se tratando de GET/SET pelo que eu entendi.

Bom galera só entrei pra dar um sinal de vida, estou na escola não tem como olhar tudo oque foi postado agora, mais tarde vou pra casa e dou uma lida geral… E Muito obrigado a galera que opiniou, que bom que o tópico está esclarecendo dúvida de outros membros!

Abraço!

ViniGodoy

É por isso que IDEs, como o Eclipse e o Netbeans, tem esse recurso automatizado.
No caso do Eclipse, por exemplo, você pode criar atributos privados sem getters e setters, clicar com o botão direito, ir em “Source” e “Generate Getters and Setters”.

claudneto

Em um aplicativo que gerencia um campeonato, por exemplo, o Saldo de Gols é calculado sempre da mesma maneira: Gols Pró - Gols Contra.

Nesse caso, vc pode fazer o setSaldo sem parâmetro já calculando isso, ou fazer ele normalmente (setSaldo (int saldo)) e fazer um método que calcula o saldo de gols.

Quando vc pergunta se pode fazer, sim, vc pode fazer qualquer coisa, porém, a manutenção do seu código pode ficar mais difícil de ser feita.

rebinho

Opa, cheguei em casa! :smiley:
Bom galera pra economizar mensagens vou escrever só aqui!rsrs

lokit"s, obrigado pelo arquivo cara… Baixei e dei uma lida achei muito legal, apesar de simples é bastante esclarecedor e a linguagem um pouco menos técnica ajuda na compreensão. Valeu!

drsmachado, valeu pelas dicas brother, esclareceu muito coisa, principalmente a dúvida que tirou do kritiuns. Obrigado!

thiagocg, interessante o link, muito bem explicado! Valeu :wink:

claudneto, obrigado pelo exemplo e esclarecimento cara!

ViniGodoy, gostei das informações, não tinha conhecimento de onde veio get e set. Quanto ao recurso de criar atributos private sem getters e setters ainda conheço pouco das IDE’s… estou usando o Netbeans porém usando quase nenhum recurso, fazendo mais “no braço”.
Isso é meio constrangedor de se perguntar mas… Sabe da existência das especificações dos JavaBeans em português?rsrs :? Ou algum lugar onde ache algo do tipo?

Abraços!

rebinho

RESOLVIDO![size=18] [/size][size=24] [/size]

Criado 27 de maio de 2011
Ultima resposta 29 de mai. de 2011
Respostas 24
Participantes 11