Setters&Getters ou Public Static

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 :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:

[quote=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 :([/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 :slight_smile: