comportement Cloneable
-
28-09-2019 - |
Question
Java doc dit -
L'objet de classe ne se mettre en œuvre l'interface Cloneable, donc appelant la méthode clone sur un objet dont la classe est l'objet se traduira lancer une exception au moment de l'exécution.
Ce qui est pourquoi la méthode clone classe Object est protégé? est-ce pas?
Cela signifie que toute classe qui ne met pas en œuvre cloneable jetteront exception CloneNotSupported lorsque sa méthode clone est invoquée.
J'ai couru un programme de test
public class Test extends ABC implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("calling super.clone");
return super.clone();
}
public static void main(String[] args) {
Test t = new Test();
try{
t.clone();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
class ABC{
}
A partir de la méthode clone de super.clone de classe de test est invoquée?
Pourquoi ne pas jeter exception?
La solution
arbre d'héritage des regards instance de Test
de t
comme
Object
ABC
Test
Test
aussi des outils Cloneable
ce qui signifie que lorsque vous appelez la méthode super.clone()
de la méthode Object
clone
sera appelée. Il vérifie si les outils de t
instance l'interface Cloneable
. Comme il le fait de mettre en œuvre la méthode ne jette pas une exception.
Autres conseils
L'interface Cloneable est une interface de marqueur qui indique que la classe mise en œuvre prend en charge la méthode clone. La raison pour laquelle super.clone () ne jette pas une exception est que la base de l'objet, il est appelé est Cloneable par héritage.
De la Javadoc:
classe implémente l'interface Cloneable pour indiquer la méthode Object.clone () qu'il est légal pour cette méthode pour faire un champ pour champ copie des instances de cette classe.
Invoquer la méthode clone de l'objet sur une instance qui ne met pas en œuvre les résultats de l'interface Cloneable à l'exception CloneNotSupportedException étant levée.
Parce que vos outils de classe Cloneable
. De la Javadoc de Cloneable
:
classe implémente l'interface Cloneable pour indiquer la méthode Object.clone () qu'il est légal pour cette méthode pour faire un champ pour champ copie des instances de cette classe.
Alors cela permet à la méthode Object
d'utilisation clone()
. Il est (à nouveau selon la Javadoc) juste une convention à la dérogation clone()
. Si vous ne le remplacez et la méthode de Object
de clone()
exécute un champ pour champ copie, vous pouvez toujours obtenir un CloneNotSupportedException
si l'un des champs est lui-même pas cloneable. Il est donc de bons conseils pour la remplacer.
Pourquoi la méthode clone classe Object
protected
?
Pour qu'une classe qui choisit de soutenir le clonage est pas forcé pour l'exposer dans son API publique.
En tant que votre exemple montre, une sous-classe est autorisé à passer outre une méthode avec un accès plus que la version héritée de la méthode. Vous ne pouvez pas réduire l'accès d'une méthode de cette façon.
Cela signifie que toute classe qui ne met pas en œuvre cloneable jetteront exception CloneNotSupported lorsque sa méthode clone est invoquée.
C'est exact.
A partir de la méthode clone de super.clone de classe de test est invoquée?
C'est exact.
Pourquoi ne pas jeter exception?
Parce que vous avez déclaré que votre classe implémente Cloneable
. Si vous ne l'aviez pas fait, il serait jeter une exception ... en supposant que votre méthode clone encore appelé super.clone()
.
Cela pourrait vous donner la réponse à pourquoi la méthode protégée pourquoi la méthode clone protégé
Il ne jette pas exception parce que vous implémentez Cloneable. De la documentation Cloneable:
"classe implémente A l'interface Cloneable pour indiquer la méthode Object.clone () qu'il est légal pour cette méthode pour faire un champ pour champ copie des instances de cette classe. La méthode de l'invocation clone de l'objet sur une instance que ne met pas en œuvre les résultats d'interface Cloneable dans la CloneNotSupportedException d'exception jetés. «
Mais comme vous le mettre en œuvre vous dire la mise en œuvre de l'objet qu'il est légal de faire une copie de champ pour champ il ne jette pas l'exception.
Je dirais une bonne question de confondre les personnes interrogées:.)
En ce qui concerne la raison pour laquelle il ne jette pas l'exception. Pensez-y de la manière d'objets. Votre objet est t de test de classe qui implémente Cloneable. Lorsque vous appelez la méthode super.clone il est encore un objet de classe Test et donc il n'y a aucune raison pour elle de jeter exception CloneNotSupported. Si elle avait été un objet de classe objet lui-même, il aurait jeté l'exception.