Nie używać public pól
Nie używaj publicpól, gdy naprawdę chcesz zawinąć wewnętrzne zachowanie klasy. Weźmy java.io.BufferedReaderna przykład. Ma następujące pole:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFjest 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 skipLFw trakcie odczytu? BufferedReaderna pewno zwariuje.
Używaj publicpól
Weźmy Pointna 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 structuż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 Pointklasy powinni być niezmienni, możesz dodać finalsłowo kluczowe, aby je wymusić:
public final double x;
public final double y;