Подтвердить что ты не робот

Зачем нам нужен конструктор копирования и когда мы должны использовать конструктор копирования в java

Я проходил через Copy Constructors, я прошел через ссылки в стеке над потоком и другими. Но я не понимаю следующие моменты.

  • Зачем нам нужен конструктор копирования
  • Когда нам понадобится Копировать конструктор

Я имею в виду, что такое точная ситуация или сценарий, который нам нужен для использования Copy Constructor. Может ли кто-нибудь объяснить с помощью примера или указать ссылки, чтобы я мог разобраться и понять их в понятном виде.

Ниже приведены ссылки, которые я прочитал, чтобы понять, что такое конструктор копирования.

http://www.programmerinterview.com/index.php/java-questions/how-copy-constructors-work/

https://deepeshdarshan.wordpress.com/2013/12/05/copy-constructors-in-java/

Вторая ссылка объясняет "почему" и "where" используется конструктор копирования. Но я все еще не понимаю.

Ниже мой класс Employee.java

package com.test;

/**
 * @author avinashd
 *
 */
public class Employee {

    private String rollNo;
    private String name;

    //constructor
    public Employee(String rollNo, String name){

        this.rollNo = rollNo;
        this.name = name;
    }

    //copy constructor
    public Employee(Employee employee){

    this.rollNo = employee.rollNo;
    this.name = employee.name;

    }

    public String getRollNo() {
        return rollNo;
    }

    public void setRollNo(String rollNo) {
        this.rollNo = rollNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Copy Constructor используется для создания и точной копии объекта с теми же значениями существующего объекта.

Скажем, например, у нас есть Сотрудник со значениями как rollNo: 1 и name: avinash. Copy Constructor создаст аналогичный объект со значениями rollNo: 1 и name: avinash. Но оба они являются двумя разными объектами, а изменения значений объекта не влияют на другой объект.

Вопрос здесь

Если у нас есть такой конструктор, как

public Employee(String rollNo, String name){
    this.rollNo = rollNo;
    this.name = name;
}

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

4b9b3361

Ответ 1

Есть две веские причины для использования конструктора копирования вместо конструктора, передающего все параметры:

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

Ответ 2

Конструкторы копирования, по договоренности, должны обеспечивать глубокую копию объектов. Как уже упоминалось в других ответах, основное удобство, предоставляемое конструкторами копирования, - это когда ваш объект становится слишком сложным. Обратите внимание, что java.lang.Cloneable предоставляет (почти) аналогичное объявление.

Но для использования конструкторов копирования в интерфейсе Cloneable существует ряд преимуществ.

  • Cloneable, поскольку интерфейс фактически не предоставляет никаких методов. Чтобы он был эффективным, вам все равно нужно переопределить метод clone java.lang.Object. Это довольно противоречивое использование для интерфейса.

  • clone возвращает Object. Для того, чтобы это было полезно, вам все равно нужно придумать. Это неудобно и может привести к ошибкам во время выполнения.

  • Метод clone плохо документирован. Для clone все может быть испорчено, если у вас есть конечные поля, указывающие на изменяемые объекты.

  • Самое главное, что конструкторы копирования могут принимать и копировать экземпляры подклассов. IMO, здесь действительно сияют конструкторы копирования.

Есть больше преимуществ (см. Joshua Bloch Effective Java 2e), но это те моменты, которые я нашел наиболее подходящими для того, над чем я работал до сих пор.

[1] Ничто в языке Java фактически не предоставляет конструкцию по умолчанию для глубокого копирования. В большинстве случаев объекты могут просто сказать программистам, что они могут быть глубоко скопированы, например, путем реализации Cloneable или предоставления конструктора копии.

Ответ 3

Что делать, если вы хотите иметь еще один экземпляр Employee с теми же значениями, что и тот, который у вас уже есть?

Вы звоните?

setName(oldEmployee.getName())..
setRollNumber(oldEmployee.getRollNumber())..
etc..

Вместо этого используйте этот

Employee copyOfEmployeeOne=new Employee(employeeOneInstance);
// no need of a sequence of setters..

Ответ 4

Другим случаем было бы сохранение объектных "исторических" значений.

Итак, у вас есть один объект, но всякий раз, когда вы меняете его состояние, вы хотите добавить его в ArrayList или какая-либо структура данных подходит вам лучше всего, вместо того, чтобы вручную копировать данные, вы просто используете "конструктор копирования" перед дальнейшей модификацией.

Ответ 5

Конструкторы копирования дают нам много преимуществ по сравнению с методом Object.clone(), потому что они

  1. Не заставляйте нас реализовывать какой-либо интерфейс или создавать исключение.
  2. Не требует никаких приведений.
  3. Не требуйте, чтобы мы зависели от неизвестного механизма создания объекта.
  4. Не требуйте, чтобы родительский класс выполнял какие-либо контракты или что-либо реализовывал.
  5. Разрешить нам изменять последние поля.
  6. Позвольте нам иметь полный контроль над созданием объекта, мы можем написать в нем нашу логику инициализации.

Подробнее о Java Cloning - конструктор копирования и клонирование

Ответ 6

Через конструктор Copy Мы можем делать клонирование с использованием очень сложных вещей, таких как реализация Cloneable interface и перезаписи метода clone. Также нам не нужно особо волноваться о глубоком клонировании.

Но следует отметить следующие моменты:

1.Когда мы реализуем Cloneable, это означает, что другие классы/пользователи могут быть клонированными объектами этого класса. Без этого другие классы могут не иметь явной информации о клонировании.

2.Если мы создаем наш конструктор копирования как закрытый, то мы можем ограничить клонирование объекта этого класса. Затем этот конструктор копирования может использоваться только для инициализации вновь созданных объектов в локальном виде, а не для целей клонирования в другом классе.

3.Когда вы не хотите, чтобы ваш класс был клонированным, но если вы создали письменный конструктор со спецификатором доступа public, то это приведет к неуверенности в том, что другие классы могут создавать объекты вашего класса.

Ответ 7

Copy Constructors реализует как мелкий, так и глубокий механизм клонирования, но основные преимущества использования конструктора копирования над клонированием (с использованием интерфейса Cloneable):

  1. Мы не нуждаемся ни в каких типах обложек при использовании метода Object.clone().
  2. Мы можем изменить окончательные поля для цели копирования, в отличие от того, что мы не можем модифицировать или получать доступ к конечным полям в случае механизма Object.clone().
  3. Это позволяет нам иметь полный контроль над созданием объекта, мы можем написать в нем нашу логику инициализации.
  4. Если мы хотим клонировать объект нашего класса, который содержит ссылочную переменную другого зависимого класса, нам не нужно реализовывать метод clone этого класса. Просто инициализируя наш конструктор копий, мы можем достичь этого.

Ответ 8

В отличие от C++, Java не предоставляет прямые конструкторы копирования. Однако одно и то же действие может быть достигнуто с помощью метода clone() или путем передачи объектов данного конструктора для копирования содержимого того же самого. Copy Constructor используется для создания точной копии объекта с теми же значениями существующего объекта.

Давайте возьмем пример, чтобы понять это -

Там есть университет, в котором учатся 10 000 студентов, и что университет должен иметь библиотеку.

Таким образом, базе данных этой библиотеки нужны точные данные всех отдельных студентов.

И здесь играет роль конструктора копий.

Которая копирует данные, хранящиеся в каждом объекте студентов, из основной базы данных в базу данных библиотеки без ошибок.

Если мы не используем конструктор копирования, вы можете себе представить, как неуклюжие и трудоемкие процессы становятся более вероятными.

Ответ 9

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

public class Employee {
    private String name;
    private int age;

    // regular constructor
    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // copy constructor
    public Employee(Employee that) {
        this.name = that.name;
        this.age = that.age;
    }
    // getters & setters
}

public class SeniorMgmt extends Employee {
    private boolean secureAccess;

    public SeniorMgmt(Employee employee, boolean secureAccess) {
        super(employee);
        this.secureAccess = secureAccess;
    }
    // getters & setters
}

public class TestDrive {
    public static void main(String[] args) {
        Employee programmer = new Employee("John", 34);
        SeniorMgmt promotedProgrammer = new SeniorMgmt(programmer, true);
    }
}