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