9
votes

Est-il possible d'écrire des constructeurs de copies pour les classes avec des variables d'interface membre en Java?

Comment écririez-vous un constructeur de copie pour une classe avec des variables d'élément d'interface?

par exemple: xxx

suis forcé d'avoir un béton < Code> Animal ? 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é!


2 commentaires

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.


4 Réponses :


0
votes

À ma connaissance, il n'y a pas d'équivalent direct à cela en Java.

La méthode "appropriée" est de rendre l'interface qu'elle est en train de mettre en œuvre Capitalable .

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.

liée: Solution recommandée pour le clonage / copie en profondeur une instance


1 commentaires

Clonable est cassé en groupe de manières et dans Java efficace Josh Bloch recommande de ne pas l'utiliser. Si vous n'avez pas ce livre, vous devriez. Voir: Artima.com/intv/bloch13.html



2
votes

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 House également, en fonction de vos besoins. XXX

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.


0 commentaires

1
votes

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 Pourquoi ne sommes-nous pas autorisés à spécifier un constructeur dans une interface? ) à l'aide d'une interface de cette façon échouera.

Donc, sur ce cas, je suggérerais d'utiliser une classe abstraite à la place: xxx


0 commentaires

7
votes

Vous avez l'un des trois choix:

  1. avoir une méthode sur 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>
  2. 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>
  3. Créez une usine de copie qui copiera chaque mise en œuvre manuellement li>
  4. 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());
    }
    


0 commentaires