N'utilisez pas de publicchamps
N'utilisez pas de publicchamps lorsque vous voulez vraiment envelopper le comportement interne d'une classe. Prenez java.io.BufferedReaderpar exemple. Il a le champ suivant:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFest 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 skipLFau milieu d'une lecture? BufferedReaderira certainement détraqué.
Utilisez des publicchamps
Prenez ce Pointcours 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 structau 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 Pointclasse ci - dessus doivent être immuables, vous pouvez ajouter un finalmot clé pour l'appliquer:
public final double x;
public final double y;