Non utilizzare i public
campi
Non usare i public
campi quando vuoi davvero avvolgere il comportamento interno di una classe. Prendi java.io.BufferedReader
ad esempio. Ha il seguente campo:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
viene letto e scritto in tutti i metodi di lettura. Cosa succede se una classe esterna in esecuzione in un thread separato ha modificato maliziosamente lo stato di skipLF
nel mezzo di una lettura? BufferedReader
andrà sicuramente in tilt.
Usa i public
campi
Prendi questa Point
classe per esempio:
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;
}
}
Ciò renderebbe molto doloroso calcolare la distanza tra due punti.
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));
La classe non ha alcun comportamento se non quello di getter e setter. È accettabile utilizzare campi pubblici quando la classe rappresenta solo una struttura di dati e non ha, e non avrà mai un comportamento (qui i getter e setter non sono considerati comportamenti). Può essere scritto meglio in questo modo:
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));
Pulito!
Ma ricordate: non solo la classe deve essere assente di comportamento, ma dovrebbe anche avere alcun motivo per avere un comportamento in futuro pure.
(Questo è esattamente ciò che descrive questa risposta . Per citare "Convenzioni del codice per il linguaggio di programmazione Java: 10. Pratiche di programmazione" :
Un esempio di appropriate variabili di istanza pubblica è il caso in cui la classe è essenzialmente una struttura di dati, senza alcun comportamento. In altre parole, se avessi usato una struct
invece di una classe (se Java supportato struct
), è opportuno rendere pubbliche le variabili di istanza della classe.
Quindi anche la documentazione ufficiale accetta questa pratica.)
Inoltre, se sei sicuro che i membri della Point
classe precedente dovrebbero essere immutabili, puoi aggiungere una final
parola chiave per farla rispettare:
public final double x;
public final double y;