Не использовать 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));
Clean!
Но помните: не только ваш класс должен отсутствовать в поведении, но он также должен иметь нет причин для поведения в будущем.
<ч />
(Это именно то, что описывает этот ответ . Цитируя "Условные обозначения кода для языка программирования Java: 10. Практика программирования" :
Одним из примеров соответствующих общедоступных переменных экземпляра является случай, когда класс по сути является структурой данных, без поведения. Другими словами, если бы вы использовали struct
вместо класса (если Java поддерживал struct
), то целесообразно сделать переменные экземпляра класса общедоступными.
Таким образом, официальная документация также принимает эту практику.)
<ч />
Кроме того, если вы уверены, что члены выше Point
класса должны быть неизменяемыми, вы можете добавить ключевое слово final
, чтобы обеспечить его выполнение:
public final double x;
public final double y;