Não use public
campos
Não use public
campos quando você realmente deseja entender o comportamento interno de uma classe. Tome java.io.BufferedReader
por exemplo. Tem o seguinte campo:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
é lido e escrito em todos os métodos de leitura. E se uma classe externa em execução em um thread separado modificasse maliciosamente o estado skipLF
no meio de uma leitura? BufferedReader
definitivamente vai dar errado.
Use public
campos
Veja esta Point
classe, por exemplo:
class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return this.x;
}
public double getY() {
return this.y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
}
Isso tornaria muito difícil escrever a distância entre dois pontos.
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(), 2));
A classe não possui nenhum comportamento além de getters e setters simples. É aceitável usar campos públicos quando a classe representa apenas uma estrutura de dados, e não possui e nunca terá comportamento (getters e setters thin não são considerados comportamento aqui). Pode ser escrito melhor desta maneira:
class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
Limpar \ limpo!
Mas lembre-se: não apenas sua classe deve estar ausente de comportamento, mas também não deve ter motivos para ter comportamento no futuro.
(É exatamente isso que esta resposta descreve. Para citar "Convenções de código para a linguagem de programação Java: 10. Práticas de programação" :
Um exemplo de variáveis de instância pública apropriadas é o caso em que a classe é essencialmente uma estrutura de dados, sem comportamento. Em outras palavras, se você usasse uma struct
classe em vez de uma classe (se suportado por Java struct
), é apropriado tornar públicas as variáveis de instância da classe.
Portanto, a documentação oficial também aceita essa prática.)
Além disso, se você tiver certeza absoluta de que os membros da Point
classe acima devem ser imutáveis, adicione a final
palavra-chave para aplicá-la:
public final double x;
public final double y;