web-dev-qa-db-fra.com

Pourquoi utilisons-nous la méthode clone () en Java?

Pourquoi utilisons-nous la méthode clone() en Java? (Veuillez donner la réponse concernant la contrainte de mémoire.) Cela réduira-t-il l'utilisation de la mémoire? Si oui, alors comment? Cela réduira-t-il l'effet des fuites de mémoire?

30
Abhisek

En dehors de n'utilisez pas clone, implémentez un constructeur de copie, vous avez posé des questions sur les contraintes de mémoire.

L'idée de clonage est de créer un double exact de l'objet cloné. Dans le pire des cas, vous utilisez ensuite deux fois plus de mémoire. Pratiquement - un peu moins, car les chaînes sont souvent internées et ne seront (généralement) pas clonées. Même si cela dépend de l'implémenteur du constructeur de la méthode/copie clone.

Voici un court exemple d'une classe avec un constructeur de copie:

public class Sheep {
  private String name;
  private Fur fur;
  private Eye[2] eyes;
  //...

  // the copy constructor
  public Sheep(Sheep sheep) {
    // String already has a copy constructor ;)
    this.name = new String(sheep.name);

    // assuming Fur and Eye have copy constructors, necessary for proper cloning
    this.fur = new Fur(sheep.fur); 
    this.eyes = new Eye[2];
    for (int i = 0; i < 2; i++) 
       eyes[i] = new Eye(sheep.eyes[i]);
  }
}

Usage:

Sheep dolly = getDolly();  // some magic to get a sheep
Sheep dollyClone = new Sheep(dolly);
19
Andreas_D

Nous ne devrions pas l'utiliser. C'est un idiome cassé et obsolète , qui devrait être évité dans le nouveau code. Mieux vaut utiliser un constructeur de copie à la place chaque fois que vous le pouvez.

14
Péter Török

Le clone () copie les valeurs d'un objet dans un autre. la méthode clone () enregistre la tâche de traitement supplémentaire pour créer la copie exacte d'un objet.

Comme vous pouvez le voir dans l'exemple ci-dessous, les deux variables de référence ont la même valeur.

class Student18 implements Cloneable {

    int rollno;
    String name;

    Student18(int rollno, String name) {

        this.rollno = rollno;
        this.name = name;
    }

    public static void main(String args[]) {

        try {
            Student18 s1 = new Student18(101, "amit");

            Student18 s2 = (Student18) s1.clone();

            System.out.println(s1.rollno + " " + s1.name);
            System.out.println(s2.rollno + " " + s2.name);

        } catch (CloneNotSupportedException c) {
        }

    }

    public Object clone() throws CloneNotSupportedException {

        return super.clone();
    }
} 

Sortie:

101 amit
101 amit

Si nous créons un autre objet par un nouveau mot-clé et assignons les valeurs d'un autre objet à celui-ci, cela nécessitera beaucoup de traitement sur cet objet. Donc, pour enregistrer la tâche de traitement supplémentaire, nous utilisons la méthode clone ().

8
Jaimin Patel

si nous devons utiliser plusieurs objets ayant les mêmes données, alors ne créez pas d'objets en utilisant un nouveau mot-clé. utilisez la méthode clone pour créer cet objet, car l'opération de création d'objet avec la méthode clone est plus rapide que l'utilisation d'un nouveau mot clé.

4
Kunal

Faire une copie d'un objet semble à première vue être une tâche simple:

Copiez simplement les valeurs de toutes les propriétés dans une autre instance de la même classe. Mais qu'en est-il des variables qui sont des références à d'autres objets? Des copies de ces valeurs de référence signifient qu'elles pointeront vers les mêmes objets que la première classe.

Mais ce n'est peut-être pas ce que nous voulons. Peut-être que nous voulons que tous les objets référencés par la copie soient également des copies indépendantes.

Ces deux types de copies d'objets sont appelés:

copie superficielle - copie exacte en bits de tous les attributs de la copie profonde de l'objet d'origine - les primitives sont copiées exactement mais les objets référencés sont copiés plutôt que les références elles-mêmes. La classe Object, héritée de toutes les classes Java, inclut la méthode clone () qui fera des copies binaires exactes de toutes les propriétés.

Cependant, clone () est une méthode protégée. Un objet donné ne peut donc pas être cloné par des instances de n'importe quelle classe en dehors du package (à moins qu'il ne s'agisse de sous-classes de la classe de cet objet). Cela permet au concepteur de classe de spécifier explicitement le type de clones (peu profonds ou profonds) à créer.

Java nécessite des classes qui souhaitent remplacer la méthode clone (), pour implémenter l'interface clonable. La méthode clone () doit également être rendue publique afin de remplacer les restrictions d'accès.

Par exemple, la classe HashTable implémente cloneable. Sa méthode clone () crée une copie superficielle afin que les clés et les valeurs de la table de hachage copiée référencent les mêmes objets que l'original.

De nombreuses classes de base Java, cependant, n'implémentent pas cloneable. Si la méthode clone () est invoquée pour de telles classes, une exception CloneNotSupportedException en résultera.

3
Noor Khan

voir contraintes de clonage

en quelques mots il sert à copier les objets à la place des références, il augmente l'utilisation de la mémoire.

0
Kevin

Nous devons éviter d'utiliser clone () ici est un bon exemple

0
Abhilash