Question sur l'interface Cloneable et l'exception qui devrait être jeté
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?
La solution
Maintenant, pour ma compréhension de la documentation, la suppression
implements Cloneable
de la classeUserProfile
devrait lancer et exception dans l'appel deup1.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(); }