44 votes

Pourquoi les attributs en Java peuvent-ils être publics?

Comme tout le monde le sait, Java suit les paradigmes de l'orientation d'objet, où l'encapsulation de données dit que les champs (attributs) d'un objet doivent être masqués pour le monde extérieur et accessibles uniquement via des méthodes ou que les méthodes sont la seule interface de la classe pour l'extérieur. monde. Alors, pourquoi est-il possible de déclarer public un champ en Java, ce qui irait à l’encontre du paradigme de l’encapsulation des données?

80voto

duffymo Points 188155

Je pense que c'est possible parce que chaque règle a son exception, toutes les meilleures pratiques peuvent être remplacées dans certains cas.

Par exemple, j'ai souvent exposer public static final de membres de données publiques (par exemple, les constantes). Je ne pense pas que c'est nocif.

Je vais souligner que cette situation est vraie dans d'autres langues en plus de Java: C++, C#, etc.

Langues pas toujours besoin de nous protéger de nous-mêmes.

Dans Oli exemple, où est le mal si j'écris de cette façon?

public class Point {
   public final int x;
   public final int y;

   public Point(int p, int q) {
      this.x = p;
      this.y = q;
   } 
}

Il est immuable et thread-safe. Les membres de données peut être public, mais vous ne pouvez pas leur faire du mal.

D'ailleurs, c'est un sale petit secret que le "privé" n'est pas vraiment privé en Java. Vous pouvez toujours utiliser la réflexion pour obtenir autour d'elle.

Alors détendez-vous. Il n'est pas si mauvais.

53voto

Oli Charlesworth Points 148744

Pour la flexibilité. Ce serait une douleur énorme si je ne pouvais pas écrire:

 class Point {
    public int x;
    public int y;
}
 

Il y a peu d'avantages précieux à cacher cela derrière des accesseurs et des passeurs.

13voto

Hot Licks Points 25075

Parce que "l'encapsulation de données" rigide n'est pas le seul paradigme, ni une caractéristique obligatoire de l'orientation d'objet.

Et, plus précisément, si un attribut de données a une méthode de définition publique et une méthode de lecture publique, et que les méthodes ne font rien d’autre que définir / obtenir l’attribut, quel est l’intérêt de le garder privé?

5voto

mre Points 21051

Toutes les classes ne suivent pas le paradigme de l'encapsulation (par exemple, les classes d'usine). Pour moi, cela augmente la flexibilité. Et de toute façon, il appartient au programmeur, et non au langage, d’établir une portée appropriée.

2voto

Jomoos Points 3391

Discuter sur le bon côté des variables publiques... Comme ça... :)

Il peut y avoir de nombreuses raisons pour utiliser public variables. Nous allons vérifier un par un:

Performance

Bien que rare, il y a certaines situations dans lesquelles il le faut. La surcharge de l'appel de la méthode devra être évitée dans certains cas.

Constantes

Nous pouvons utiliser les variables par des constantes, qui ne peut pas être modifié après qu'il est initialisé dans le constructeur. Il contribue à la performance. Ces derniers peuvent parfois être constantes statiques, comme la chaîne de connexion à la base de données. Par exemple,

public static final String ACCEPTABLE_PUBLIC = "Acceptable public variable";

D'Autres Cas

Il existe des cas où public ne fait pas de différence ou d'avoir un getter et setter est inutile. Un bon exemple avec Point est déjà écrit comme réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X