为什么我们需要复制构造函数,什么时候应该在java中使用复制构造函数

2022-09-01 07:16:42

我正在浏览复制构造函数,我已经浏览了堆栈中的链接,而不是流和其他链接。但我不清楚以下几点。

  1. 为什么我们需要一个复制构造函数
  2. 我们什么时候需要复制构造函数

我的意思是我们需要使用复制构造函数的确切情况或场景是什么。有人可以用一个例子来解释或指出链接,这样我就可以清楚地了解和理解它们。

以下是我通过的链接,以了解什么是复制构造函数。

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

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

第二个链接解释了“为什么”和“在哪里”使用复制构造函数。但我仍然不清楚。

下面是我的班级员工.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;
    }
}

复制构造函数用于创建具有与现有对象相同的值的对象的精确副本。

例如,假设我们有一个员工,其值为 和 。复制构造函数将创建一个类似的对象,其值为 和 。但是两者都是2个不同的对象,对on对象的值的更改不会影响另一个对象。rollNo: 1name: avinashrollNo: 1name: avinash

这里的问题是

当我们有一个构造函数时,例如

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

以创建对象。我们可以调用同一构造函数来创建另一个对象。但是为什么我们需要调用复制构造函数。我们什么时候需要调用它?请解释


答案 1

使用复制构造函数而不是传递所有参数的构造函数有 2 个很好的理由:

  1. 当您有一个具有许多属性的复杂对象时,使用复制构造函数要简单得多
  2. 如果向类中添加一个属性,则只需更改复制构造函数以考虑此新属性,而不是更改其他构造函数的每个匹配项

答案 2

按照惯例,复制构造函数应提供对象的深层副本。正如其他答案已经提到的,复制构造函数提供的主要便利是当你的对象变得太复杂时。请注意,它提供了一个(几乎)类似的声明。java.lang.Cloneable

但是,在接口上使用复制构造函数有许多优点。Cloneable

  1. Cloneable作为接口实际上不提供任何方法。要使其有效,您仍然需要重写 的方法。对于接口来说,这是非常违反直觉的用法。clonejava.lang.Object

  2. clone返回 .要使它有任何用处,您仍然需要进行类型转换。这很尴尬,可能会导致运行时错误。Object

  3. 该方法的文档记录很差。因为 ,如果你有指向可变对象的最终字段,事情可能会变得混乱。cloneclone

  4. 最重要的是,复制构造函数可以接收子类的深层复制实例。IMO,这是复制构造函数真正闪耀的地方。

还有更多的优势(参见Joshua Bloch的 Effective Java 2e),但我发现这些观点与我迄今为止所做的工作最相关。

[1] Java语言中没有任何东西实际上为深度复制提供了默认结构。最多,对象可以告诉程序员,它们可以通过实现或提供复制构造函数来深度复制。Cloneable


推荐