Question:
package GoodQuestions;
public class MyClass {
MyClass() throws CloneNotSupportedException {
try {
throw new CloneNotSupportedException();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
MyClass obj = new MyClass();
MyClass obj3 = (MyClass)obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Ici, la classe 'MyClass' peut pouvoir cloner son propre objet en appelant la méthode de clonage dans la classe 'Object' . Le même paquet 'GoodQuestions' génère l'erreur de compilation suivante.
'La méthode clone () du type Object n'est pas visible'
Alors, voici le code qui jette l'erreur ci-dessus?
package GoodQuestions;
public class TestSingleTon {
public static void main(String[] args) {
MyClass obj = new MyClass();
MyClass obj3 = obj.clone(); ---> here is the compile error.
}
}
Cette erreur se produit car dans la classe Object, la méthode clone () est protégée . Vous devez donc remplacer la méthode clone () dans la classe respective . Ajouter le code ci-dessous dans MyClass
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
Mettre également en œuvre une interface clonable. public class MyClass implements Cloneable
clone()
a un accès protégé. Ajouter ceci dans MyClass
public Object clone(){
try{
return super.clone();
}catch(Exception e){
return null;
}
}
Changer également en public class MyClass implements Cloneable
Parce que clone () est une méthode protégée. Voir Object.clone () pour plus de détails.
Remplacez clone () dans MyClass et faites implémenter la classe Cloneable interface.
La subtilité est que la méthode clone()
de MyClass
est héritée et non définie dans MyClass
. Donc MyClass
peut invoquer clone()
de l’objet car il est protected , mais MyClass
n’a pas vraiment a a clone()
de lui-même, donc TestSingleTon
ne peut pas accéder à clone()
de MyClass
car il n’existe pas de méthode clone()
. Bien qu'ils soient tous les deux dans le même package, vous devez définir une méthode clone()
dans MyClass
pour vous assurer qu'elle "possède" réellement la clone()
. En passant, n'oubliez pas de mettre en œuvre l'interface Cloneable
pour MyClass
.
Vous devez juste faire en sorte que Class implémente une interface clonable. Pas besoin de fournir une implémentation pour clone ().
La méthode Object.clone()
a un accès protégé, ce qui signifie it's visible to sub-classes and classes in the same package
.
Il est bon d'avoir un constructeur copy pour copier manuellement l'objet.
/**
Deep copy all the information from other to this
*/
public MyClass (MyClass other) {
this.id = other.id;
}
J'ai fait quelques tests sur ce code et voici mes conclusions:
Lorsqu'un membre protégé est hérité d'un paquet à l'autre, il devient membre privé de la classe héritée.
tandis que
lorsqu'un membre protégé est hérité dans le même package, il devient default membre de la classe héritée.
Dans votre exemple, clone () de la classe Object est hérité dans MyClass dans le package . La classe Object est dans le package Java.lang et MyClass dans le package GoodQuestions . La méthode clone () devient donc un membre privé de la classe MyClass. .
Cela explique pourquoi vous ne pouvez pas accéder à la méthode clone () à partir de la classe TestSingleTon.
Pour que vous puissiez cloner MyClass, il doit implémenter l’interface Cloneable