Не используй 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;