Il semble que l'orthodoxie Java soit à ce stade que l'on ne devrait fondamentalement jamais utiliser de champs publics pour l'état d'objet. (Je ne suis pas nécessairement d'accord, mais ce n'est pas pertinent pour ma question.) Étant donné que, serait-il juste de dire que d'où nous sommes aujourd'hui, il est clair que les champs publics de Java étaient une erreur / faille de la conception du langage? Ou existe-t-il un argument rationnel selon lequel ils sont une partie utile et importante de la langue, même aujourd'hui?
Merci!
Mise à jour: je connais les approches les plus élégantes, comme en C #, Python, Groovy, etc. Je ne recherche pas directement ces exemples. Je me demande vraiment s'il y a toujours quelqu'un au fond d'un bunker, marmonnant à quel point les champs publics sont vraiment merveilleux, et comment les masses ne sont que des moutons, etc.
Mise à jour 2: les champs publics finaux clairement statiques sont le moyen standard de créer des constantes publiques. Je faisais plus référence à l'utilisation de champs publics pour l'état d'objet (même l'état immuable). Je pense que cela semble être une faille de conception que l'on devrait utiliser les champs publics pour les constantes, mais pas pour l'état… les règles d'un langage devraient être appliquées naturellement, par syntaxe, et non par des directives.
Réponses:
Je les aime, tant que le champ est final et n'est utilisé qu'en interne dans l'application, non exposé dans une API pour d'autres applications. Cela rend votre code plus court et plus lisible.
Vous ne devez pas exposer les champs publics dans une API, car en exposant les champs publics, vous exposez également l'implémentation. Si vous l'exposez en tant que
getXXX()
méthode, vous pouvez modifier l'implémentation sans modifier l'interface API. Par exemple, vous pouvez modifier et obtenir la valeur d'un service distant, mais les applications qui utilisent l'API n'ont pas besoin de le savoir.Il s'agit d'une conception viable pour les
public final
champs des classes immuables .De Java efficace :
Voir aussi Pourquoi ne devrais-je pas utiliser des POJO immuables au lieu de JavaBeans?
la source
getXXX()
méthode, vous pouvez modifier l'implémentation sans modifier l'interface API. Par exemple, vous pouvez modifier et obtenir la valeur d'un service distant, mais les applications qui utilisent l'API n'ont pas besoin de le savoir.L'utilisation de paires de méthodes get / set est le défaut de conception historique tragique. Je ne peux pas penser à un autre langage qui implémente les propriétés de manière verbeuse et inefficace.
la source
Je pense que les champs publics sont corrects pour une classe qui est essentiellement un type de valeur comme un nombre complexe ou un point, où la classe ne fait guère plus que regrouper les types primitifs comme une structure de style C et peut-être définir quelques opérateurs.
la source
java.awt.Point
et les amis sont un peu un cauchemar.Point
est qu'il est ambigu si une variable de typePoint
est censée encapsuler un emplacement, ou est censée encapsuler l'identité d'une entité avec un emplacement qui peut changer. Conceptuellement, je considérerais le code qui circulePoint
comme un code qui circule autour des tableaux.Point
et le modifie, dois-je m'attendre à ce que l'objet auquel il se réfère se mette à jour proprement à l'écran? Non, le problèmePoint
est qu'il est modifiable. Nous avionsString
/StringBuffer
mais l'idée ne semblait pas passer. / La transmission de tableaux présente des problèmes similaires.Pour définir des constantes publiques, il est toujours utile. Par exemple
Cependant, préférez toujours les énumérations lorsque cela est possible. Par exemple
Pour simuler des classes de structure simples, il est également utile. Aucune raison de créer un getter et un setter pour chaque champ, quand ils sont tous publics de toute façon.
la source
Avant que les IDE ne se généralisent, rendre tous vos domaines publics était un outil puissant pour créer rapidement des prototypes / preuves de concepts.
De nos jours, il y a très peu d'excuse pour les utiliser, quand vous pouvez générer une paire getter / setter avec un clic de souris.
la source
public final
champs sont plus lisibles que 10getXXX()
méthodes.const
mot-clé serait suffisant, s'ils ne sont pas statiques, ils constituent une violation grave de l'encapsulation.C'est subjectif, mais mon avis est que toute la notion public / privé est dépassée et à l'envers.
En python, il n'y a pas de public / privé; tout est public au fond. N'a pas causé beaucoup de problèmes.
En Java, vous avez tendance à créer des getters / setters inutiles pour chaque champ pour éviter le péché de les marquer "publics". (À mon humble avis, si vous vous trouvez en train de le faire, vous devez simplement les marquer comme publics).
la source