Métodos Get e Set ou Construtor?

Ola pessoal, estou com uma dúvida quanto aos métodos get e set
Eu li em um artigo da Caelum que não é indicado ficar usando muito estes métodos pois podem quebrar o encapsulamento
Mas se eu tiver por exemplo uma classe Pessoa e atributos como nome, endereço, idade, telefone, etc.
O que seria mais indicado neste caso, sera que seria melhor utilizar o construtor ou existe outra maneira mais indicada ?
Já agradeço a ajuda de vocês.
Abraço!

Acho que a questão é se há necessidade ou não de ter os métodos get e set. O texto abaixo, do livro Introdução à Arquitetura e Design de Software, recomenda: Nunca crie um getter ou setter sem uma necessidade real.

http://www.arquiteturajava.com.br/livro/cuidado-com-o-modelo-anemico.pdf

O problema é que pode-se pensar que é preciso sempre criar um get e set para todos os atributos privados. Há muitos casos em que isso não é necessário.
No exemplo do livro, há a classe Conta. Não é necessário um método setSaldo(), porque nunca será necessário atribuir o saldo diretamente. Será necessário ter os métodos saca() e deposita(), que fazem mais sentido no negócio.

Então acho que a resposta é depende: depende da necessidade.

1 curtida

Para classes de entidades como Pessoa, Cliente, Veiculo, etc. não há problemas em se criar get/set para seus atributos. Agora, suponha que você tenha uma classe Semaforo:

class Semaforo{
  private String sinalAtual = "VERMELHO";

  public void mudaSinal(){
     if( "VERMELHO".equals(sinalAtual)){
        sinalAtual = "VERDE";
     }else if( "VERDE".equals(sinalAtual) ){
        sinalAtual = "AMARELO";
     }else if( "AMARELO".equals(sinalAtual) ){
        sinalAtual = "VERMELHO";
     }else{
        throw new Exception("sinal inválido");
     }
  }

  public String getSinal(){
     return sinalAtual;
  }
}

nesse caso, o método mudaSinal() implementa as regras de mudança de cor de um semáforo. Observe que como outros objetos não tem acesso à variável sinalAtual, não existe risco de que o semáforo fique inconsistente. Para fins de consulta, eu criei um get para sinalAtual. Como String’s são imutáveis, eu não preciso criar uma cópia separada da String.

Agora, se eu tivesse exposto a variável através de um set, então qualquer objeto poderia definir o estado do semáforo, podendo causar inconsistências. Um outro objeto poderia passar de VERMELHO para AMARELO, ou ainda, atribuir uma cor AZUL para um semáforo. É isso que significa quebrar encapsulamento.

Bom, se é que eu entendi corretamente, os get e set devem ser substituidos basicamente por regras de negócio, é isso mesmo?
Pois acho que foi mais ou menos isso que pude perceber nos exemplos que os amigos deram, se não for isso me corrijam por favor

Obs: Toda vez que envio alguma dúvida aqui no fórum eu me surpreendo mais com a rapidez e riqueza de detalhes que os amigos daqui respondem, muito obrigado pela força

Basicamente a idéia é essa mesmo. Um outro exemplo que gosto é com figuras geométricas:

class Quadrado{
   private final double lado;
   
   public Quadrado(double lado){
      this.lado = lado;
   }

   public double getLado(){ 
      return lado;
   }

   public double getArea(){
      return lado * lado;
   }

   public double getPerimetro(){
      return 4 * lado;
   }
}

Nesse caso, eu modelei Quadrado como um objeto imutável, ele possui um único atributo lado que deve ser fornecido através do construtor. Perceba que apesar de ele possuir 3 métodos get, eu possuo apenas 1 atributo.

[quote=ronibass]Bom, se é que eu entendi corretamente, os get e set devem ser substituidos basicamente por regras de negócio, é isso mesmo?
Pois acho que foi mais ou menos isso que pude perceber nos exemplos que os amigos deram, se não for isso me corrijam por favor

Obs: Toda vez que envio alguma dúvida aqui no fórum eu me surpreendo mais com a rapidez e riqueza de detalhes que os amigos daqui respondem, muito obrigado pela força[/quote]

Há casos em que você realmente irá precisar do get e/ou do set. Mas isso precisa ser avaliado caso a caso. O que não é recomendável é sempre criar gets e sets para todos os atributos privados.

Não há problemas, mas é meio feio não acha?

Creio que uma boa abordagem é receber no construtor tudo que é “obrigatório” para o objeto, para ele ser um good citizen.

abrassss