Почему мы используем метод clone () в Java? - PullRequest
29 голосов
/ 27 апреля 2011

Почему мы используем метод clone() в Java?(Пожалуйста, дайте ответ относительно ограничений памяти.) Это уменьшит использование памяти?Если да, то как?Это уменьшит эффект утечки памяти?

Ответы [ 7 ]

19 голосов
/ 27 апреля 2011

Помимо не используйте клон, реализуйте конструктор копирования , вы спрашивали об ограничениях памяти.

Идея клонирования заключается в создании точной копии клонированного объекта. Таким образом, в худшем случае вы используете вдвое больше памяти. Практически - немного меньше, потому что строки часто интернированы и (как правило) не будут клонированы. Хотя это зависит от разработчика метода клона / конструктора копирования.

Вот краткий пример класса с конструктором копирования:

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]);
  }
}

Использование:

Sheep dolly = getDolly();  // some magic to get a sheep
Sheep dollyClone = new Sheep(dolly);
14 голосов
/ 27 апреля 2011

Мы должны не использовать это. Это испорченная и устаревшая идиома , которую следует избегать в новом коде.Вместо этого лучше использовать конструктор копирования.

8 голосов
/ 12 января 2016

clone () копирует значения объекта в другой. Метод clone () сохраняет дополнительную задачу обработки для создания точной копии объекта.

Как видно из приведенного ниже примера, обе ссылочные переменные имеют одинаковое значение.

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();
    }
} 

Выход:

101 amit
101 amit

Если мы создадим другой объект по новому ключевому слову и присвоим значения другого объекта этому, это потребует большой обработки этого объекта. Поэтому для сохранения дополнительной задачи обработки мы используем метод clone ().

4 голосов
/ 26 июля 2015

если нам нужно использовать много объектов, имеющих одинаковые данные, не создавайте объекты, используя ключевое слово new.используйте метод clone для создания этого объекта, потому что операция создания объекта с методом clone выполняется быстрее, чем использование нового ключевого слова.

3 голосов
/ 27 апреля 2011

Создание копии объекта на первый взгляд кажется простой задачей:

Просто скопируйте значения всех свойств в другой экземпляр того же класса. Но как насчет переменных, которые являются ссылками на другие объекты? Копии этих ссылочных значений означают, что они будут указывать на те же объекты, что и первый класс.

Но, может быть, это не то, что мы хотим. Возможно, мы хотим, чтобы все объекты, на которые ссылается копия, также были независимыми копиями.

Эти два типа копий объектов называются:

мелкая копия - точная битовая копия всех атрибутов исходного объекта глубокое копирование - примитивы копируются точно, но объекты, на которые ссылаются, копируются, а не сами ссылки. Класс Object, который наследуется всеми классами Java, включает метод clone (), который будет делать точные битовые копии всех свойств.

Однако clone () является защищенным методом. Таким образом, данный объект не может быть клонирован экземплярами каких-либо классов вне пакета (если они не являются подклассами класса этого объекта). Это позволяет конструктору классов явно указывать, какие клоны (мелкие или глубокие) создавать.

Java требует классы, которые хотят переопределить метод clone () для реализации клонируемого интерфейса. Метод clone () также должен быть общедоступным, чтобы переопределять ограничения доступа.

Например, класс HashTable реализует cloneable. Его метод clone () делает поверхностную копию, поэтому ключи и значения скопированной HashTable будут ссылаться на те же объекты, что и оригинал.

Однако многие основные классы Java не поддерживают клонирование. Если для таких классов вызывается метод clone (), возникает исключение CloneNotSupportedException.

0 голосов
/ 27 апреля 2011

Мы должны избегать использования clone () Здесь хороший пример

0 голосов
/ 27 апреля 2011

см. ограничения клонов

в нескольких словах он используется для копирования объектов вместо ссылок, это увеличивает использование памяти.

...