Quelqu'un a-t-il des pratiques suggérées ou établies des meilleures pratiques et des conventions de nommage pour les constructeurs de copies / méthodes d'usine, etc. en Java? En particulier, disons que j'ai une classe Selon le titre, je veux éviter chose code> et je veux une méthode quelque part qui renvoie un nouveau chose code> avec la même valeur qu'un chose code> transmis (ou comme l'instance s'il s'agit d'une méthode d'instance). Auriez-vous cela comme constructeur ou une méthode statique d'usine ou une méthode d'instance? Que l'appelleriez-vous? P>
clone () code> et clonable code>. p>
8 Réponses :
Vous pouvez écraser le clone () -method, si vous voulez. Une autre pratique utilisée est un constructeur qui prend un objet de ce type, c'est-à-dire
Je l'appellerais une méthode de copie ou un constructeur de copie (selon le cas). Si c'était une méthode statique, alors je l'appellerais une usine. P>
En termes de quoi faire, l'option la plus flexible et la plus longue du vie est un constructeur de copie. Cela donne aux sous-classes la capacité de se copier comme le parent. P>
Je ferais un constructeur puis lorsque vous voulez le cloner p>
Vous avez quelques options, implémentez clonable code>, ajoutez un constructeur de copie mais ma manière préférée est d'utiliser une méthode (statique ou instance) qui a un nom qui est descriptif de la copie de la copie L'opération fait - est-ce une copie profonde ou peu profonde, etc. p>
Java efficace recommande l'un des éléments suivants: p>
Un constructeur de copie (comme indiqué par d'autres personnes): P>
élément public (élément d'élément) p> li>
une méthode d'usine de copie: p>
Objet statique public NewInstance (article) P> li> ol>
(aussi, pas de copie pour immutables) p>
La principale différence est que, avec # 1, vous choisissez la classe actuelle du résultat, et avec # 2, la mise en œuvre peut renvoyer une sous-classe. La sémantique de la classe peut vous guider dans laquelle une meilleure est la meilleure. P>
Utilisez structures de données immuables . La seule raison pour laquelle vous avez besoin que vous avez besoin par exemple, voici un "setter" pour un objet vectoriel 3D immuable: p> donc je suppose ce que je dis c'est ... je Utilisez des constructeurs de copies au lieu de mutation et je les nommez simplement en fonction de l'attribut que je veux modifier. p> p> clone () code> est que vous militant vos objets en place. Arrêter de faire ça. Pensez à la façon dont vous pouvez:
Une autre option consiste à implémenter la méthode de copie dans l'objet em> source em>, par exemple: vous implémenteriez ensuite copier avec un morceau de code comme: p> Ceci peut être utile si: p>
loc code> en tant que propriété de chose code> li>
Ce n'est pas la meilleure approche de la copie d'objets, mais ce qui suit est parfois utile si vous souhaitez effectuer une copie ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
//Serializes the input object
oos.writeObject(input);
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
//Copy of the input object
Object output = ois.readObject();
Pourquoi voulez-vous éviter le clonage () et clonable?
@Thomas Owens, voir ici: Artima.com/intv/bloch13.html
Pour les réponses que le constructeur de copie d'état en tant que solution: Copier Constructor ne gère pas correctement tous les cas. Par exemple, lorsque vous ne connaissez pas la classe de béton (mais vous pouvez toujours utiliser le constructeur de copie à l'intérieur de votre méthode Clone / Copy / WhateTouthaCallit).