Question

La documentation Java dit:

  

A la classe implémente Cloneable   l'interface pour indiquer au   Procédé Object.clone () qui est   juridique de cette méthode pour faire un   champ pour champ copie des instances de   cette classe.

     

méthode clone de l'objet sur un Invoquer   instance qui ne met pas en œuvre la   les résultats d'interface Cloneable dans la   exception CloneNotSupportedException   être jeté.

     

Par convention, les classes qui mettent en œuvre   cette interface devrait remplacer   Object.clone (protégé) avec   une méthode publique. Voir Object.clone ()   Pour plus de détails sur le remplacement de cette méthode.

     

Notez que cette interface ne   contenir la méthode clone. Donc,   il est impossible de cloner un objet   simplement en vertu du fait qu'il   implémente cette interface. Même si la   méthode clone est appelé pensivement,   il n'y a aucune garantie que ce sera   réussir.

Et j'ai cette classe UserProfile:

public class UserProfile implements Cloneable {
    private String name;
    private int ssn;
    private String address;

    public UserProfile(String name, int ssn, String address) {
        this.name = name;
        this.ssn = ssn;
        this.address = address;
    }

    public UserProfile(UserProfile user) {
        this.name = user.getName();
        this.ssn = user.getSSN();
        this.address = user.getAddress();
    }

    // get methods here...

    @Override
    public UserProfile clone() {
        return new UserProfile(this);
    }
}

Et pour tester porpuses, je le fais dans main():

UserProfile up1 = new UserProfile("User", 123, "Street");
UserProfile up2 = up1.clone();

Jusqu'à présent, aucun problème compilation / en cours d'exécution. Maintenant, pour ma compréhension de la documentation, la suppression implements Cloneable de la classe UserProfile devrait lancer une exception dans l'appel de up1.clone(), mais il ne fonctionne pas.

J'ai lu ici que l'interface Cloneable est cassé, mais je ne sais pas vraiment ce que cela signifie. Am quelque chose que je manque?

Était-ce utile?

La solution

  

Maintenant, pour ma compréhension de la documentation, la suppression implements Cloneable de la classe UserProfile devrait lancer et exception dans l'appel de up1.clone(), mais il ne fonctionne pas.

Tant que votre classe a encore une implémentation de la méthode clone(), une exception ofcourse pas être jeté quand vous l'appelez -. Il fonctionne comme toute autre méthode, il n'y a rien de magique impliqué

La mise en œuvre de clone() en classe Object est ce qui lève l'exception, mais vous avez remplacé cette méthode.

Autres conseils

Cela signifie que si vous implémente Cloneable et omettez la méthode clone () et appelez ensuite la méthode clone (), une exception sera levée.

EDIT : Il a été mentionné probablement 1 milliard de fois avant, mais

  

NE PAS UTILISER LE CLONE MÉTHODE!

Si vous avez besoin de fonctionnalités de clonage, fournir un constructeur de copie à la place.

L'interface est appelée brisée parce qu'elle ne vous oblige pas à mettre en œuvre clone () (ce qui devrait).

Je suis d'accord avec les réponses et ajouter quelque chose: l'interface est comme une « étiquette » pour dire que votre classe met en œuvre clone (). C'est utile dans api comme des méthodes lorsque vous ne connaissez pas le type d'objet. Ensuite, vous pouvez écrire

if (myobj instanceof Cloneable) { dosmthng(); }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top