oque é melhor num programa, usar variaveis “Public Static” ou deixá-las como “private” e adicionar os metodos Setter&Getters ?
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
use encapsulamento
static so no main
E como encapsular um vetor, seja ele Integer ou String?
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)
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:
[code]private int[] vetor;
public int getValor (int index){
return this.vetor[index];
}
public void setValor(int index, int valor) {
this.vetor[index] = valor;
}
[/code]
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.
[quote=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
[/quote]
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
[quote=Mephy][quote=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
[/quote]
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[/quote]
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.
Obrigado a todos pelas dicas
Consegui fazer com o exemplo do viniGodoy
Só não entendi e não consegui fazer cópias de segurança
[quote=InicianteJavaHenrique]Obrigado a todos pelas dicas
Consegui fazer com o exemplo do viniGodoy
Só não entendi e não consegui fazer cópias de segurança :([/quote]
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”.
Ah… então obrigado. Vou procurar sobre estas classes