N'utilisez pas de public
champs
N'utilisez pas de public
champs lorsque vous voulez vraiment envelopper le comportement interne d'une classe. Prenez java.io.BufferedReader
par exemple. Il a le champ suivant:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
est lu et écrit dans toutes les méthodes de lecture. Que se passe-t-il si une classe externe exécutée dans un thread séparé modifie par malveillance l'état de skipLF
au milieu d'une lecture? BufferedReader
ira certainement détraqué.
Utilisez des public
champs
Prenez ce Point
cours par exemple:
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;
}
}
Cela rendrait le calcul de la distance entre deux points très pénible à écrire.
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 n'a aucun comportement autre que les getters et les setters. Il est acceptable d'utiliser des champs publics lorsque la classe ne représente qu'une structure de données et n'a pas, et n'aura jamais de comportement (les getters et setters fins ne sont pas considérés comme des comportements ici). Il peut être mieux écrit de cette façon:
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));
Nettoyer!
Mais rappelez-vous: non seulement votre classe ne doit pas avoir de comportement, mais elle ne devrait pas non plus avoir de raison d'avoir un comportement à l'avenir également.
(C'est exactement ce que cette réponse décrit. Pour citer "Conventions de code pour le langage de programmation Java: 10. Pratiques de programmation" :
Un exemple de variables d'instance publique appropriées est le cas où la classe est essentiellement une structure de données, sans comportement. En d'autres termes, si vous auriez utilisé une struct
au lieu d'une classe (si Java était pris en charge struct
), il est approprié de rendre publiques les variables d'instance de la classe.
La documentation officielle accepte donc également cette pratique.)
De plus, si vous êtes très sûr que les membres de la Point
classe ci - dessus doivent être immuables, vous pouvez ajouter un final
mot clé pour l'appliquer:
public final double x;
public final double y;