Não use publiccampos
Não use publiccampos quando você realmente deseja entender o comportamento interno de uma classe. Tome java.io.BufferedReaderpor 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 skipLFno meio de uma leitura? BufferedReaderdefinitivamente vai dar errado.
Use publiccampos
Veja esta Pointclasse, 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 structclasse 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 Pointclasse acima devem ser imutáveis, adicione a finalpalavra-chave para aplicá-la:
public final double x;
public final double y;