Verwenden Sie keine public
Felder
Verwenden Sie keine public
Felder, wenn Sie das interne Verhalten einer Klasse wirklich umbrechen möchten. Nehmen wir java.io.BufferedReader
zum Beispiel. Es hat das folgende Feld:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
wird in allen Lesemethoden gelesen und geschrieben. Was ist, wenn eine externe Klasse, die in einem separaten Thread ausgeführt wird, den Status während eines Lesevorgangs in böswilliger Absicht geändert hat skipLF
? BufferedReader
wird auf jeden Fall drunter und drüber gehen.
Verwenden Sie public
Felder
Nehmen Sie diese Point
Klasse zum Beispiel:
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;
}
}
Dies würde die Berechnung des Abstands zwischen zwei Punkten sehr schmerzhaft machen.
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));
Die Klasse hat kein anderes Verhalten als einfache Getter und Setter. Es ist akzeptabel, öffentliche Felder zu verwenden, wenn die Klasse nur eine Datenstruktur darstellt und kein Verhalten hat und niemals haben wird (Thin Getter und Setter werden hier nicht als Verhalten betrachtet). Es kann besser so geschrieben werden:
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));
Reinigen!
Aber denken Sie daran: Nicht nur Ihre Klasse muss kein Verhalten haben, sondern es sollte auch keinen Grund geben, sich auch in Zukunft zu verhalten.
(Genau dies wird in dieser Antwort beschrieben. So zitieren Sie "Code-Konventionen für die Java-Programmiersprache: 10. Programmierpraktiken" :
Ein Beispiel für geeignete öffentliche Instanzvariablen ist der Fall, in dem die Klasse im Wesentlichen eine Datenstruktur ohne Verhalten ist. Mit anderen Worten, wenn Sie eine struct
anstelle einer Klasse verwendet hätten (wenn Java unterstützt wird struct
), ist es angebracht, die Instanzvariablen der Klasse öffentlich zu machen.
Die offizielle Dokumentation akzeptiert diese Praxis also auch.)
Wenn Sie besonders sicher sind, dass Mitglieder der oben genannten Point
Klasse unveränderlich sein sollten, können Sie ein final
Schlüsselwort hinzufügen , um dies durchzusetzen:
public final double x;
public final double y;