1
public MyConstructor(MyConstructor mc){
   this.setId(mc.getId());
   this.setName(mc.getName());
}

这里为什么我们需要通过获取它的getter方法来设置构造函数中的值。这背后有什么特殊目的吗?

4

4 回答 4

1

正如其他答案中已经指出的那样,这种构造函数主要用于克隆对象,有时也称为复制构造函数

正如 Joshua Bloch 在他的书“ Effective Java ”第 11 项中所建议的那样,这种构造函数通常应该优于实现clone()方法,因为该clone()方法存在一些问题(有关详细信息,请参阅书或相应的 stackoverflow 问题)。

没有什么明显的理由来完全那样实现它——因此,人们并不真正需要这种形式的它。如评论中所述,可以(最有可能)将其写为

public MyConstructor(MyConstructor mc){
    this.id = mc.getId();
    this.name = mc.getName();
}

或者

public MyConstructor(MyConstructor mc){
    this.setId(mc.id);
    this.setName(mc.name);
}

或者

public MyConstructor(MyConstructor mc){
    this.id = mc.id;
    this.name = mc.name;
}

作者这里选择使用嵌套的set(mc.get())方式。get它具有潜在的优势,即它仅依赖于/方法定义的接口,set因此可能对更改更加健壮。

人们可能会争论这总体上是否是一种好的做法,但我认为对于复制构造函数,它很好而明确地指出:“这个对象在这里被初始化,完全基于(并且完全像)给定的对象”。


旁注:克隆一个对象并为克隆提供相同的 ID 很可能会破坏ID的目的- 但在某些情况下这可能是合适的

于 2015-03-20T10:59:47.040 回答
0

考虑一下克隆对象,但这不是克隆。如果您遇到手上有一个MyConstructor(类型)对象的情况,您需要创建另一个具有相同对象类型的MyConstructor对象。所以,在你的MyConstructor类中,你需要一个像上面这样的构造函数。

在那里,当您创建全新的第二个对象时,您将手中的对象拿走并获取该对象的id

于 2015-03-20T10:33:19.157 回答
0

像这样的构造函数背后的目的主要是为了克隆。假设您需要将一个对象的值分配给另一个对象而不是引用,这将正常工作。

已在此处讨论: 如何在 Java 中复制对象?

于 2015-03-20T10:49:13.937 回答
0

如果您的类将由(子)类派生,则这一点很重要。

public class Child extends Parent {

    private int id;
    private String name = "Child";

    ...
    // getter and setters...
}


public class Parent {

    private int id;
    private String name = "Parent";

    public Parent(Parent parent) {
        this.setId(parent.getId());
        // option#1
        this.setName(parent.getName());
        // option#2
        // this.name = parent.name;
    }
    ...
    // getter and setters...
}

样品主要:

public class Main {
    public static void main(String ...strings ) {

        Parent parent = new Parent();
        Child child = new Child();

        Parent parent2 = new Parent(child);
        System.out.println(parent2.getName());

    }
}

输出:

Child

但是如果我们使用 Option#2this.name = parent.name代替,输出将是

Parent
于 2015-03-20T11:00:42.273 回答