Setters and Getters

Olá pessoal…eu tenho a seguinte classe

[code]class Trem{

//declaraçoes de variaveis
private String nome,cidadeAtual,cidadeDestino;
private double cargaAtual,cargaMaxima;
private static int totalTrem;

//setter and getters
Trem(){
    this.totalTrem = this.totalTrem + 1;    
}
public static int getTotalDeTrens(){
    return Trem.totalTrem;
}
//setters da classe Trem
public void setNome(String nome){
    this.nome = nome;
}
public String getNome(){
    return this.nome;
}
public void setLocal(String cidadeAtual){
    this.cidadeAtual = cidadeAtual;
}
public String getLocal(){
    return this.cidadeAtual;
}
public void setDestino(String cidadeDestino){
    this.cidadeDestino = cidadeDestino;
}
public String getDestino(){
    return this.cidadeDestino;
}    

}
[/code]

eh normal essa grande quantidade de metodos…1 pra cada coisa q estou fazendo , ou ha uma outra maneira de fazer essa combinação de atribuiçoes e retornos

É super normal sim.

[quote=“Fierodd”]Olá pessoal…eu tenho a seguinte classe

[code]class Trem{

//declaraçoes de variaveis
private String nome,cidadeAtual,cidadeDestino;
private double cargaAtual,cargaMaxima;
private static int totalTrem;

//setter and getters
Trem(){
    this.totalTrem = this.totalTrem + 1;    
}
public static int getTotalDeTrens(){
    return Trem.totalTrem;
}
//setters da classe Trem
public void setNome(String nome){
    this.nome = nome;
}
public String getNome(){
    return this.nome;
}
public void setLocal(String cidadeAtual){
    this.cidadeAtual = cidadeAtual;
}
public String getLocal(){
    return this.cidadeAtual;
}
public void setDestino(String cidadeDestino){
    this.cidadeDestino = cidadeDestino;
}
public String getDestino(){
    return this.cidadeDestino;
}    

}
[/code]

eh normal essa grande quantidade de metodos…1 pra cada coisa q estou fazendo , ou ha uma outra maneira de fazer essa combinação de atribuiçoes e retornos[/quote]

Sim isso é normal… essa é a forma que eu conheço.

:wink:

Ainda está ate pequeno…

É normal, pois você está trabalhando com uma classe básica. Se os atributos da sua classe são declarados como privados, as informações não serão acessadas por nenhuma outra classe. Esse conceito é chamado de encapsulamento. A informação é guardada de maneira segura. Se é do seu interesse que essas informações sejam visíveis para outras classes. Utilize métodos get(). Se você deseja que alterar o valor dessas informações utilize métodos set().
Entaõ para sua classe ficar perfeita, para cada atributo que você criar, haverá pelo menos 2 métodos, um get() e um set(). Por isso para classes com muitos atributos aparentam ter código muito longo.

Abraço

Aproveitando os setter e getters…

É possivel guardar todos os trens q eu criar num array estatico?

exemplo:

eu crio trem1 e trem2
array[1] = trem1;
array[2] = trem2;

e depois acessar seus atributos num loop

for(i=1;i<array.lenght;i++){
imprimeTrens();
}

tipo no metodo usar

array[ i ].getNome();

  • ou - isso?

Eh normal mais ou menos.

Nao tem muita diferença entre fazer isso e declarar todos os membros publicos, nao eh? Da uma olhada aqui.

Shoes

acentuando o comentario do pcalcado, se forem ler livros como o dos Deitel, verão q ele deixa bem claro pra q server um getter/setter… o certo é ter código de validação em um setter, e em um getter talvez um código q configure um valor da maneira q o cliente da interface pública da classe espere ler… por ex:

class Pessoa {

   private int idade;

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

o certo do setter desse código seria algo como:

   public void setIdade( int idade ) {
      
      if ( idade < 0 || idade > umaIdadeMuitoGrandeParaSerReal )
         // idade = 0 ou lança uma exception?

      this.idade = idade;
   }

ou então, o certo seria salvar a data de nascimento do cara em um objeto Date da vida…

pcalcado…o q vc fez aqui foi usar os sets e gets de uma maneira conjunta pra maior consistência…dei uma olhada rapida soh , mas me pareceu parecido (a estrutura do codigo)

se puder me explicar melhor o sentido real daquela materia agradeço!!!

Basicamente:
Quando você precisar [color=“red”] e tiver um bom motivo[/color] (ou seja: quase nunca exceto nas trocas entre camadas - da camada de negócios para apresentação, etc.) use get para expôr seus atributos e set para definir valores.

Não crie objetos que só tem get/set e não exponham todos os atributos com get/set. Não deixe que objetos externos mudem o estado, isso é o princípio básico de encapsulamento.

Shoes

hmmmm…vc quer dizer entao q devo fazer as classes se comunicarem somente o necessario, sem ter q criar gets and set pra tudo…mas se por acaso tenho uma classe onde preciso alterar todos (ou muitos) de seus atributos durante a execução, seria entao melhor colocar as execuçõesde alteração direto no main?

sabe onde acho material proprio sobre encapsulamento assim consigo visualizar ao invés de ficar supondo

Obrigado!!!

Qualquer bom livro de OOP te da o caminho das pedras.

Existe apenas um tipo de lugar onde voce rpecisa fazer isso: bordas entre paradigmas. Quando voce passa de uma interface para objetos ou para/de um SGBD, voce rpecisa deste tipo de coisa. Neste caso voce deve prover os metodos, porem com muito cuidado para nao usar estes metodos em processamento de regra de negocios.

Shoes

Ae pessoal vlw pelos helps…to aproveitando o msm topico pq no final acaba sendo o msm assunto

quando uso herança em classes java pq eu preciso criar um metodo na classe pai (msm q esse nao faça nada) pra poder reescrevê-lo nas classes filhas???

Nao entendi…

Se voce nao definir um metodo, ia sobrescrever o que?

Essa eh a duvida…
pq eu preciso criar o metodo na classe pai

pq nao posso simplesmente escreve-lo na filha e usa-lo?
isso eh parte da herança?

Procure por polimorfismo :wink:

Você não precisa necessariamente cria-lo na classe pai, pode simplesmente criar na filha, a diferença é que não é possivel acessa-lo atraves da classe pai, só da filha, pois ele só existe nela, assim:

public class Pai{
  public String metodo1(){
    return "abc";
  }
}

public class Filho extends Pai{
  public String metodo2(){
      return "1234";
  }
}

public class Teste{
  //polimorfismo
  private Pai p = new Filho();
  private Filho f = new Filho();

  public Teste(){
    //possivel pois metodo1() foi declarado na classe Pai
    p.metodo1();
    //impossivel pois mesmo o objeto de p sendo Filho, está em uma variavel do tipo Pai, e Pai não tem o metodo2()
    p.metodo2();
    //possivel pois metodo1() foi herdado de Pai
    f.metodo1();
    //possivel pois metodo2() foi declarado na classe Filho
    f.metodo2();
  }
}

Ae pessoal vlw por todo o help…to apanhando mas blz…
entendi herança e polimorfismo (entendi nao significa q eu esteja bom no assunto ainda…hehehhe)

mas estudando herança eu fiquei em duvida de qdo devo usá-la ao inves de usar interface…não eh a msm coisa?