Je ne comprends pas la nature des haricots Java qui bien. Eh bien, au moins comment je les vois utilisés dans certaines bases de code qui passent dans notre boutique.
J'ai trouvé cette question: p>
Java Haricots: Qu'est-ce que je manque? P>
La réponse acceptée Il semble que les programmeurs ont tendance à abuser de Java Bean (qui Je ne doute vraiment pas), mais je vois que cela se produit si souvent et si délibérément, je pense que je manque toujours quelque chose. P>
Je vois le code qui ressemble à: p>
public class FooBean { private int a; private int b; private int c; public int getA() { return a; } public int setA(int x) { a = x; } // etc... }
6 Réponses :
'Getters' et 'Setters' sont excellents si vous souhaitez remplacer l'accès à vos données, par exemple pour la journalisation / la sécurité ou le retour d'une valeur différente de la classe d'origine. P>
Les gens utilisent des getters / setissements stupides, sans doute à ce sujet. P>
Cependant, imaginez combien de douleur vous devez passer pendant 2 ans sur la route lorsque vous réalisez
Vous devez dépasser des espaces de la chaîne dans votre N'oubliez pas l'une des règles majeures de la conception orientée objet "Code vers une interface, pas une mise en œuvre". L'accès à des domaines publics d'une classe est certainement ce dernier et fera que le code se refactore soit beaucoup plus difficile. p> setemail (String Email); code> méthode et tout votre code est difficile à utiliser des champs publics au lieu d'un appel de méthode. P>
L'objection n'est pas nécessairement à l'idée de getters et de setters, mais au fait que nous devons écrire les choses à la main.
@skaffman, les IDE modernes fournissent des modèles afin qu'il soit facile de l'obtenir autogène. Eclipse peut générer des constructeurs et obtenir / se mettre à plusieurs champs.
OK très bien,. Mais vous vous retrouvez toujours avec des charges de débutant inutiles.
@skaffman: Les IDes peuvent facilement être écrits pour masquer les getters "inutiles" et les setters, comme Eclipse peut masquer les déclarations "Importer". Mais je n'ai pas remarqué un IDE qui fait cela. Soit je ne cherche pas très fort ... ou la plupart des programmeurs ne se soucient pas assez d'exiger que les IDes implémentent ceci.
@nos Votre réponse montre le problème exact avec les setters et les getters. Vous ne demandez pas à un objet de données, vous le demandez de fonctionner sur ses données. Donc, vous pourriez avoir un nom, mais vous le feriez final et la définir dans le constructeur que si possible (où vous pouvez facilement le manipuler avant de définir le champ) ... Vous ne devriez probablement pas avoir de getter, mais ils Sont moins flagrant ... mais vous pouvez avoir un getPreferredemail () qui retournerait l'une des adresses électroniques qu'elle stocke, ce n'est pas un getter pur. Mieux encore pourrait être une méthode mailto () dans votre objet.
SANS SETTER, vous ne pouvez pas vérifier les invariants:
public void setFoo(Foo foo) { if (foo == null) { throw new InvalidFoo(); } this.foo = foo; }
C'était une réponse juste ... contré!
D'accord, n'a rien à voir avec la question. Une réponse comme "l'eau est humide" mérite-t-elle un vote à la hausse? Il est 100% d'informations correctes et très utiles, mais pas vraiment applicable à la question à la main.
En outre, c'est un anti-schéma pour les invariants, il serait bien préférable de le rendre final et de la définir dans le constructeur, de cette façon, vous savez certainement que même votre propre code ne le définit pas. Cela serait très utile si vous aviez absolument besoin d'utiliser le modèle de constructeur, mais si c'était le cas, vous devriez retourner "ceci".
Anti-motif? Vous ne pouvez pas modéliser tous les objets comme immuables
@Bill: Cependant, vous avez raison, ma réponse n'est pas bonne comme l'acceptée
En fait, oui, il y a de la magie. P>
C'est un motif vraiment muet, mais des haricots gris (que tous les composants sont) étaient destinés à être analysés de manière réfléchi par un constructeur d'interface graphique. Les champs de jeu public / get sont destinés à être "propriétés" que l'utilisateur peut bouer lors de la construction de son interface graphique. P>
Edit: En défense du soleil, je devrais dire que bien que le modèle s'est avéré assez odieux à cause de toutes les personnes qui la copiaient et ont commencé à l'utiliser tout au long de leur code non-haricot, il a permis aux gens d'intégrer des cours avec un constructeur d'interface graphique sans utiliser de métadonnées extérieures. Vous n'avez pas besoin de fichier XML ou de fichier de propriétés pour l'éditeur, il était aussi simple que le bouton d'extension et laissant tomber votre nouvel objet sur la palette. p>
Ce modèle a été utilisé dans d'autres endroits et, comme vous l'avez remarqué, c'est à peu près la même chose que d'avoir des domaines publics. Je pense que c'est l'un des pires patères que le soleil créé lors de la mise en place de Java, mais il n'y avait pas d'autres solutions évidentes (je pense que tout le concept était en quelque sorte cloué par les premières personnes qui tentent de construire les premiers constructeurs d'interface graphique avant la sortie de Java). < / p>
Il y a maintenant une solution bien meilleure: utiliser des annotations pour marquer des champs privés, un outil de réflexion pourrait toujours les analyser et les lier aux commandes de constructeur. Ce serait un bon nettoyant de l'offre et ne rendrait pas tous vos objets si vulnérables aux changements d'état externes. P>
Les haricots Java sont, comme vous le soulignez, une convention codante assez triviale. P>
La partie utile est qu'elles étaient une convention du tout. Cela a permis de construire des outils auxiliaires qui étaient basés sur des nouvelles idées (à l'époque), telles que la spécification de ce que le nom des getters et des setters était, et une attente selon laquelle les méthodes spécifiques existeraient sans avoir à attribuer une interface. Cela a permis de faire suffisamment de flexibilité pour faire ce que vous vouliez, mais vous a toujours permis d'utiliser l'interface graphique pour assembler les haricots. P>
À ce stade, avec une introspection complète étant la norme et d'autres langues ayant formalisé la fonctionnalité GET / SET, et de nombreuses autres façons de faire ce que font les haricots, je pense qu'ils sont une idée dont l'heure est passée. P>
+1 pour un bon résumé de ce que la Convention est pour. Mais je prendrais problème avec votre affirmation selon laquelle la Convention n'est plus nécessaire. Le printemps est un exemple qui utilise une utilisation intensive de câblage de style de haricot. Si vous avez un service Web à grande échelle qui est en grande partie composé de composants Java, il est beaucoup plus important de les câbler avec un fichier XML que d'écrire un code Java pour effectuer le câblage.
Et la plupart utiliseraient maintenant des annotations sur le câblage de style de haricot, car le style de haricot est, dans un mot, mauvais.
Vous ne manquez pas le point. Les getters / setters sont laids, mais sont incorporés dans de nombreux outils qui font des hypothèses sur les noms de classe / de méthode / de champs (par exemple, le ressort) qui (à part leur valeur évidente pour l'encapsulation), ils deviennent effectivement une exigence approfondie, à moins que vous n'êtes pas obligatoirement travailler dans un très em> contexte limité et privé. p>
Ne préfère pas maintenant les annotations parce que les haricots sucent? Les setters et les getters sont l'inverse de l'encapsulation par la manière - ils permettent l'accès à l'état interne qui doit être complètement caché.
Malheureusement, la plupart des réponses à cette question ont manqué la question réelle et l'interprétent comme «pourquoi avoir des méthodes de getter et de réglage» ...
De ce que vous dites les gars, il semble que Java Haricots soit plus d'une pratique de programmation de culte de cargaison que toute autre chose.
@Mike: Donnez votre réponse si vous pensez que vous avez bien compris
Je pensais juste que je mentionnerais - de nombreux haricots sont utilisés pour le transport de données et n'ont aucune donnée. Je suis arrivé à la conclusion qu'il s'agit d'un mauvais usage de code. La seule raison pour laquelle je peux voir que celles-ci ne sont pas simplement des hashtables est la sécurité de type. Lorsqu'il n'ait besoin d'un paquet de propriétés comme celui-ci maintenant, j'écoule effectivement un hachage de propriétés dans mon paquet. J'aimerais voir que Java adopte une sorte de motif de forfait de propriété de type prédéfini avec une notification et une validation automatisées, mais la plupart des gens semblent être heureux de passer leur journée à écrire des ensembles et de getters.