clonage d’object sans implémentation d’interface clonable

Pour cloner l’object, dois-je implémenter une interface «clonable»? car ici ma classe est un fichier jar (je veux dire API). donc je ne peux pas éditer la classe. J’ai entendu dire que toutes les classes sont étendues à la classe d’objects de base et que cette classe d’objects implémente une interface clonable. cela signifie-t-il que nous pouvons directement cloner l’object sans implémenter l’interface? si c’est le cas dans mon éclipse, je ne reçois aucune option pour cloner l’object. existe-t-il un autre moyen de cloner l’object sans implémenter l’interface clonable ? S’il vous plaît, expliquez.

La classe Java Object Cloneable pas l’interface Cloneable . Il a cependant la méthode clone() . Mais cette méthode est protected et CloneNotSupportedException si CloneNotSupportedException est appelée sur un object qui Cloneable pas l’interface Cloneable . Donc, si vous ne pouvez pas modifier la classe que vous voulez cloner, vous n’avez pas de chance et vous devrez trouver un autre moyen de copier l’instance.

Il convient toutefois de noter que le système de clonage en Java est rempli de trous et qu’il n’est généralement plus utilisé. Découvrez cette interview de Josh Bloch de 2002 expliquant quelques-uns des problèmes.

Quoi qu’il en soit, il est généralement préférable d’éviter clone (), car il est difficile de le faire correctement ( http://www.javapractices.com/topic/TopicAction.do?Id=71 ). Peut-être que la classe en question a un constructeur de copie?

Alternativement, si Serializable ou Externalizable est implémenté, vous pouvez le copier en profondeur en l’écrivant dans un stream d’octets et en le relisant.

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); Object deepCopy = ois.readObject(); 

( http://www.jguru.com/faq/view.jsp?EID=20435 ). C’est rapide et facile, mais pas joli… Je le considère généralement comme un dernier recours.

En utilisant l’API de Reflection, vous pouvez y arriver.

Leur est une api qui clone l’object sans implémenter l’interface clonable.

Essaye ça

https://github.com/kostaskougios/cloning

Aussi, vous pouvez trouver plus de détails sur le clonage d’objects ici

http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

Essayer d’appeler la méthode clone sur une classe qui n’implémente pas Cloneable lève une exception CloneNotSupported et aucune classe Object n’implémente Cloneable.

voici le javadoc de la méthode clone de la classe Object

 CloneNotSupportedException if the object's class does not * support the Cloneable interface. Subclasses * that override the clone method can also * throw this exception to indicate that an instance cannot * be cloned. 

De plus, la méthode Object # clone est protégée. Vous devez donc implémenter la méthode clone dans votre classe et la rendre publique afin qu’elle puisse être accessible aux classes créant des objects de votre classe qui peuvent ensuite invoquer le clone. Un bon exemple est la manière dont le clone est implémenté dans ArrayList.

ArrayList implémente cloneable comme ci-dessous la classe publique ArrayList extend AbstractList implémente List, RandomAccess, Cloneable, java.io.Serializable

puis implémente la méthode clone:

 /** * Returns a shallow copy of this ArrayList instance. (The * elements themselves are not copied.) * * @return a clone of this ArrayList instance */ public Object clone() { try { ArrayList v = (ArrayList) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } 

La méthode clone () de la classe Object est protégée, ce qui signifie que toutes les classes l’hériteront avec un modificateur d’access protégé. Par conséquent, si vous essayez d’y accéder en dehors de cette classe sans la cloner, vous ne la verrez pas. invoquez-le sans implémenter l’interface clonable.

Si vous envisagez de créer un comportement de clonage, vous devez écrire une nouvelle méthode dans votre classe, puis créer une copie de tous les champs qu’il contient. C’est comme créer une nouvelle copie d’un état existant d’un object. object.

 public class TestCloneable { private Ssortingng name = null; /** * @param name the name to set */ public void setName(Ssortingng name) { this.name = name; } /** * @return the name */ public Ssortingng getName() { return name; } public TestCloneable createCopy(){ TestCloneable testCloneable = new TestCloneable(); testCloneable.setName(this.getName()); return testCloneable; } 

}

Il n’est pas obligatoire d’implémenter une interface clonable pour créer un clone d’un object. Vous pouvez écrire votre propre méthode de clonage dans la classe dont vous voulez cloner l’object.