Setters&Getters ou Public Static

10 respostas
guilherme.dio

oque é melhor num programa, usar variaveis “Public Static” ou deixá-las como “private” e adicionar os metodos Setter&Getters ?

10 Respostas

therafa

a diferença entre ter uma variável estática é que no momento que você instanciar a classe terá ela apenas uma vez na memória, o que em vários casos é bastante utilizado. porém, se tiver bastante uso dessas variáveis vai acabar deixando seu programa lento. asseguro utilizar getters e setters caso for o caso do encapsulamento. Leia mais sobre, Caelum tem artigos ótimos

rafaelviny

use encapsulamento

static so no main

InicianteJavaHenriqu

E como encapsular um vetor, seja ele Integer ou String?

Mephy

use sempre o encapsulamento:

private int[] vetor; public void setVetor (int[] valor) { this.vetor = valor; } public int[] getVetor (){ return this.vetor; }
(e não esqueça de instanciá-lo no construtor, pra evitar exception de null pointer)

ViniGodoy
Detalhe, o exemplo do Mephy é um caso clássico de quebra de encapsulamento. Por exemplo, ali, a variável estaria exposta mesmo que você só tivesse o getter:
private int[] vetor;
public int[] getVetor (){
   return this.vetor;
}
Exemplo:
obj.getVetor()[3] = 5; //Modificação
Esse é um problema com objetos não imutáveis. No caso, o ideal é usar o getter e o setter assim:
private int[] vetor;
public int getValor (int index){
   return this.vetor[index];
}

public void setValor(int index, int valor) {
   this.vetor[index] = valor;
}
Ou usar cópias de segurança:
private int[] vetor;
public int[] getVetor (){
   return Arrays.copyOf(vetor);
}
Mais informações: http://www.guj.com.br/java/104592-encapsulamento#564414

Como falei no outro tópico, static quase sempre é uma opção ruim. O static não existe no contexto do objeto, mas da classe toda. Por ele ter um escopo muito aberto (ele existe enquanto a classe existir), ele também irá segurar coisas na memória, pois ele impede a chamada do garbage collector no que estiver associado a ele. Ele também é ruim para uso multi-thread. Evite static ao máximo que você puder.

Mephy

ViniGodoy:
Detalhe, o exemplo do Mephy é um caso clássico de quebra de encapsulamento. Por exemplo, ali, a variável estaria exposta mesmo que você só tivesse o getter:

private int[] vetor; public int[] getVetor (){ return this.vetor; }

Exemplo:

obj.getVetor()[3] = 5; //Modificação

Isso é possível? OMG~
vou ver se daqui pra frente uso arraycopy ‘-’ (bem melhor aprender enquanto não se está em projeto algum)
Valeu a dica

ViniGodoy

Mephy:
ViniGodoy:
Detalhe, o exemplo do Mephy é um caso clássico de quebra de encapsulamento. Por exemplo, ali, a variável estaria exposta mesmo que você só tivesse o getter:

private int[] vetor; public int[] getVetor (){ return this.vetor; }

Exemplo:

obj.getVetor()[3] = 5; //Modificação

Isso é possível? OMG~
vou ver se daqui pra frente uso arraycopy ‘-’ (bem melhor aprender enquanto não se está em projeto algum)
Valeu a dica

Sim, é por isso que Collections também tem métodos como
Collections.unmodifiableList, Collections.unmodifiableMap e Collections.unmodifiableSet.

É um erro muito comum o pessoal esquecer dessas cópias.

A dica das cópias está no livro Effective Java.

InicianteJavaHenriqu

Obrigado a todos pelas dicas :slight_smile:

Consegui fazer com o exemplo do viniGodoy :slight_smile:

Só não entendi e não consegui fazer cópias de segurança :frowning:

Giulliano

InicianteJavaHenrique:
Obrigado a todos pelas dicas :slight_smile:

Consegui fazer com o exemplo do viniGodoy :slight_smile:

Só não entendi e não consegui fazer cópias de segurança :(

No dia a dia não vejo muita razão para trabalhar com cópias de segurança. Então a menos que o arquiteto defina isso como requisito. Não esquente a cabeça. Para entender melhor leia sobre a Classe “Cloneable” e estude um pouco sobre o modificador “final”.

InicianteJavaHenriqu

Ah… então obrigado. Vou procurar sobre estas classes :slight_smile:

Criado 10 de abril de 2011
Ultima resposta 14 de abr. de 2011
Respostas 10
Participantes 7