Non utilizzare i publiccampi
Non usare i publiccampi quando vuoi davvero avvolgere il comportamento interno di una classe. Prendi java.io.BufferedReaderad esempio. Ha il seguente campo:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFviene 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 skipLFnel mezzo di una lettura? BufferedReaderandrà sicuramente in tilt.
Usa i publiccampi
Prendi questa Pointclasse 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 structinvece 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 Pointclasse precedente dovrebbero essere immutabili, puoi aggiungere una finalparola chiave per farla rispettare:
public final double x;
public final double y;