Nie używać public
pól
Nie używaj public
pól, gdy naprawdę chcesz zawinąć wewnętrzne zachowanie klasy. Weźmy java.io.BufferedReader
na przykład. Ma następujące pole:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
jest odczytywany i zapisywany we wszystkich metodach odczytu. Co się stanie, jeśli klasa zewnętrzna działająca w osobnym wątku złośliwie zmodyfikuje stan skipLF
w trakcie odczytu? BufferedReader
na pewno zwariuje.
Używaj public
pól
Weźmy Point
na przykład tę klasę:
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;
}
}
To bardzo utrudniłoby obliczenie odległości między dwoma punktami.
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));
Klasa nie ma żadnego innego zachowania niż zwykłe metody pobierające i ustawiające. Dopuszczalne jest stosowanie pól publicznych, gdy klasa reprezentuje tylko strukturę danych, a nie ma i nigdy nie będzie zachowywać się (cienkie elementy pobierające i ustawiające nie są tutaj uważane za zachowanie). Można to lepiej napisać w ten sposób:
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));
Czysty!
Ale pamiętaj: Nie tylko klasa musi być nieobecny zachowania, ale powinno także mieć żadnego powodu, aby mieć zachowań w przyszłości.
(Dokładnie to opisuje ta odpowiedź . Cytując „Konwencje kodu dla języka programowania Java: 10. Praktyki programowania” :
Jednym z przykładów odpowiednich zmiennych instancji publicznej jest przypadek, w którym klasa jest zasadniczo strukturą danych, bez zachowania. Innymi słowy, jeśli struct
użyłbyś klasy zamiast (jeśli Java jest obsługiwana struct
), to należy ustawić publiczne zmienne instancji klasy.
Oficjalna dokumentacja akceptuje również tę praktykę).
Ponadto, jeśli masz pewność, że członkowie wyższej Point
klasy powinni być niezmienni, możesz dodać final
słowo kluczowe, aby je wymusić:
public final double x;
public final double y;