Comment écririez-vous un constructeur de copie pour une classe avec des variables d'élément d'interface?
par exemple: p> suis forcé d'avoir un béton < Code> Animal Code>? EM> Si tel est le cas, il semble y avoir réutilisé la classe des maisons avec des chiens vs. Maisons avec des chats devient compliqué! p> p>
4 Réponses :
À ma connaissance, il n'y a pas d'équivalent direct à cela en Java. P>
La méthode "appropriée" est de rendre l'interface qu'elle est en train de mettre en œuvre Capitalable . P>
Et le moyen le plus simple pourrait être d'utiliser la réflexion. Je sais qu'il y a une bibliothèque qui gère des copies profondes d'objets arbitraires, mais je ne peux pas me rappeler le nom pour le moment. P>
liée: Solution recommandée pour le clonage / copie en profondeur une instance p>
Clonable CODE> est cassé en groupe de manières et dans
Java efficace code> Josh Bloch recommande de ne pas l'utiliser. Si vous n'avez pas ce livre, vous devriez. Voir: Artima.com/intv/bloch13.html
Si je comprends votre problème, car vous ne pouvez pas spécifier constructeurs dans une interface, vous devez déclarer une méthode de copie profonde dans votre interface et la mettre en œuvre dans vos classes. Vous ne pouvez pas instancier une interface. Vous voudrez peut-être aussi une copie plus profonde dans Le problème bien sûr, c'est que c'est à vous de décider de faire ça ne pas faire quelque chose de mal. Cela sent un peu comme vous ne voulez pas vraiment une interface ici, mais plutôt une classe abstraite. p> p> House Code> également, en fonction de vos besoins.
OK, laissez-moi vous expliquer un problème dans ce code. Notez que lorsque vous avez une interface, vous définissez un comportement, pas une abstraction ou une identité d'un objet (ou d'une créature) telle qu'un animal. Sur ce cas, vous avez besoin d'une classe abstrait au lieu d'une interface.
ça commence dit. Vous ne pouvez pas avoir de constructeur sur une interface (voir Donc, sur ce cas, je suggérerais d'utiliser une classe abstraite à la place: p>
Vous avez l'un des trois choix:
ianimal code> pour cloner profondément l'objet (utilisé par des bibliothèques telles que les interfaces DOM comme nœud.clonenode (booléen) code>
) li>
- Créez un constructeur de copie dans toutes les implémentations de
ianimal code> qui prend le type de béton et apporte une exigence dans le contrat d'interface, puis utilisez la réflexion pour y accéder li>
- Créez une usine de copie qui copiera chaque mise en œuvre manuellement li>
- Utilisez une bibliothèque 3ème partie qui implémente le clonage profond pour vous avec ses propres contrats, tels que les constructeurs NO-ARGS, les champs non finaux, les classes code> Serializable >, etc., comme celles énumérées ici li>
ol>
méthode de copie forte> p> pour # 1, faites quelque chose comme: p> xxx pré> Mettre en œuvre dans votre Types de béton, puis appelez cette méthode pour la copier: P>
public static IAnimal copyAnimal(IAnimal animal) {
if (animal instanceof Dog)
return copyDog((Dog) animal);
if (animal instanceof Cat)
return copyCat((Cat) animal);
//...
else
throw new IllegalArgumentException("Could not copy animal of type: "
+ animal.getClass().getName());
}
Si vous souhaitez une copie profonde, vous devez également mettre en œuvre un constructeur de copie chez l'animal.
Vous ne pouvez pas simplement implémenter un constructeur de copie dans l'animal. Dans ce cas, vous avez Ianimal, une interface. Donc, vous auriez besoin de savoir quelle classe concrète vous devez instancier.