Statique usine méthodes vs Instance (normal) les constructeurs?
Dans une langue où les deux sont disponibles, préféreriez-vous voir un exemple de constructeur ou une méthode statique qui renvoie une instance?
Par exemple, si vous êtes à la création d'un String
à partir d'un char[]
:
-
String.FromCharacters(chars);
-
new String(chars);
- Ont ajouté "méthode" pour le titre, parce que sinon, il suggère que le choix est entre une instance constructeur ou un constructeur statique. (Le texte est clair, mais le titre a provoqué une certaine "Hein?" question dans mon esprit 🙂
- Votre modification a été annulée 🙂
- Va le refaire ensuite, l'examen de la question n'est pas à propos de constructeurs statiques...
Vous devez vous connecter pour publier un commentaire.
Dans Efficace Java, 2nd edition, Joshua Bloch certainement recommande à l'ancienne. Il y a quelques raisons que je me souvienne, et sans doute certains je ne peux pas:
Les inconvénients:
J'écris un constructeur lors de la création de l'instance n'a pas d'effets secondaires, c'est à dire quand la seule chose que le constructeur est en train de faire l'initialisation de propriétés. - Je écrire une méthode statique (et faire le constructeur privé) si la création de l'instance ne fait quelque chose que vous ne serait pas normalement attendre d'un constructeur à faire.
Par exemple:
Parce que j'adhère à la présente convention, si je vois
lors de la lecture de mon code, j'ai un ensemble très différent des attentes à propos de ce que chacune de ces deux lignes est en train de faire. Ce code n'est pas de me dire ce que c'est qui rend la création de Foo différent de la création d'un Bar, mais il me dit que j'ai besoin de regarder.
Foo.New()
que le défaut de remplacement pournew
, etFoo.FromAbc()
etc pour le spécial ceux.J'ai travaillé sur une API publique récemment, et j'ai été à l'agonie sur le choix de la statique de l'usine de méthodes contraceptives constructeur. Statique méthodes de fabrique certainement faire sens dans certains cas, mais dans d'autres, il n'est pas clair et je ne suis pas certain que la cohérence avec le reste de l'API est une raison suffisante pour inclure plus de constructeurs.
De toute façon, je suis tombé sur un citation de Bill Venners interview avec Josh Bloch que j'ai trouvé utile:
Avoir lu cette citation, et l'étude d'Uri mentionné*, je me sens enclin à pencher en faveur des constructeurs, sauf s'il existe des raisons impérieuses de le faire autrement. Je pense statique méthode de fabrique, sans bonne raison est probablement juste une complexité inutile et plus-ingénierie. Bien que je pourrais bien changer d'avis et de nouveau d'ici demain...
*Malheureusement, cette étude se focalise moins sur la statique de l'usine de méthodes et de plus en plus sur le modèle de fabrique (où une usine distincte de l'objet existe pour créer de nouvelles instances), donc je ne suis pas sûr que l'on peut vraiment en tirer la conclusion que statique usine méthodes de confondre de nombreux programmeurs. Bien que l'étude ne me donnent l'impression que, souvent, ils le feraient.
Si votre objet est immuable, vous pouvez peut-être utiliser la méthode statique de retourner les objets mis en cache et vous épargner de l'allocation de mémoire et de traitement.
Il y a un article à partir de la CISP'07 qui a étudié la facilité d'utilisation des constructeurs vs usine de modèles. Tandis que je préfère usine de modèles, l'étude a montré que les développeurs ont été plus lents à trouver une bonne méthode de fabrique.
http://www.cs.cmu.edu/~NatProg/documents/Ellis2007FactoryUsability.pdf
new
normal des constructeurs.Méthode Statique. Ensuite, vous pouvez retourner une valeur null, plutôt que de lancer une exception (à moins qu'un type de référence)
Je préfère instance constructeur, juste parce que cela fait plus de sens pour moi, et il y a moins de risque d'ambiguïté avec ce que vous essayez d'exprimer (c'est à dire: que si FromCharacters est une méthode qui prend un seul caractère). Certes subjective, mais.
Personnellement, je préfère voir un constructeur normal, puisque contructors devraient être utilisés pour construire. Cependant, si il y a une bonne raison à pas utiliser un, c'est à dire si FromCharacters déclare explicitement qu'il n'alloue pas de mémoire, il en vaudrait la peine. La "nouvelle" dans l'invocation a un sens.
Il dépend. Pour les langues dans lesquelles l'aide d'une instance constructeur est "normal", je voudrais généralement utiliser un, sauf si j'avais de bonnes raisons de ne pas. Il suit le principe de moindre surprise.
Par le chemin, vous avez oublié un autre cas courant: null/constructeur par défaut couplé avec une méthode d'initialisation.
Comme Jon Skeet paraphrasé Josh Bloch, il y a un certain nombre de raisons pour lesquelles une statique usine méthode est préférable à un constructeur, dans de nombreux cas. Je dirais que si la classe est un simple pas cher le programme d'installation ou d'utilisation compliquées, séjour avec le idiomatiques constructeur. Moderne Jvm faire l'objet de création extrêmement rapide et bon marché. Si la classe peut être sous-classé ou vous êtes en mesure de le faire immuables (un gros avantage pour la programmation simultanée, qui va seulement pour obtenir plus importantes), puis aller avec la méthode de fabrique.
Une astuce de plus. Ne pas le nom de la méthode de fabrique
Foo.new*
ouFoo.create*
. Une méthode avec ces noms doit toujours renvoyer une nouvelle instance, et ce faisant on oublie un des grands avantages de la méthode de fabrique. Une meilleure convention de nommage estFoo.of*
ouFoo.for*
. Le Google Goyave bibliothèque (anciennement Google Collections de la Bibliothèque) fait un excellent travail de ce, à mon humble avis.of*
etfor*
sont meilleurs noms quenew*
oucreate*
? Nommant les choses, à juste titre, est important pour moi, donc j'aimerais apprendre quelque chose de nouveau ici.Bien sûr, il y a plusieurs avantages de la statique des méthodes fabrique plus de constructeurs.
getInstance()
en Singleton.