Не використовувати 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;