Не используй public поля
Не используйте publicполя, если вы действительно хотите обернуть внутреннее поведение класса. Взять java.io.BufferedReaderк примеру. Имеет следующее поле:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFчитается и пишется во всех методах чтения. Что если внешний класс, работающий в отдельном потоке, злонамеренно изменил состояние skipLFв середине чтения? BufferedReaderобязательно сойду с ума.
Используй publicполя
Возьмите этот Pointкласс, например:
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;
}
}
Это сделает расчет расстояния между двумя точками очень болезненным для написания.
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));
Класс не имеет никакого поведения, кроме простых методов получения и установки. Допустимо использовать открытые поля, когда класс представляет собой просто структуру данных, не имеет и никогда не будет иметь поведения (тонкие методы получения и установки не рассматриваются здесь). Это можно записать лучше так:
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));
Чистота!
Но помните: не только в вашем классе должно отсутствовать поведение, но также не должно быть причин иметь поведение в будущем.
(Это именно то, что описывает этот ответ . Цитировать «Соглашения о коде для языка программирования Java: 10. Практика программирования») :
Одним из примеров соответствующих общедоступных переменных экземпляра является случай, когда класс по сути является структурой данных без какого-либо поведения. Другими словами, если бы вы использовали structкласс вместо (если поддерживается Java struct), то целесообразно сделать переменные экземпляра класса общедоступными.
Таким образом, официальная документация также принимает эту практику.)
Кроме того, если вы уверены, что члены вышеупомянутого Pointкласса должны быть неизменяемыми, вы можете добавить finalключевое слово, чтобы обеспечить его выполнение:
public final double x;
public final double y;