public MyConstructor(MyConstructor mc){
this.setId(mc.getId());
this.setName(mc.getName());
}
这里为什么我们需要通过获取它的getter方法来设置构造函数中的值。这背后有什么特殊目的吗?
public MyConstructor(MyConstructor mc){
this.setId(mc.getId());
this.setName(mc.getName());
}
这里为什么我们需要通过获取它的getter方法来设置构造函数中的值。这背后有什么特殊目的吗?
正如其他答案中已经指出的那样,这种构造函数主要用于克隆对象,有时也称为复制构造函数
正如 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的目的- 但在某些情况下这可能是合适的
考虑一下克隆对象,但这不是克隆。如果您遇到手上有一个MyConstructor
(类型)对象的情况,您需要创建另一个具有相同对象类型的新MyConstructor
对象。所以,在你的MyConstructor
类中,你需要一个像上面这样的构造函数。
在那里,当您创建全新的第二个对象时,您将手中的对象拿走并获取该对象的id
像这样的构造函数背后的目的主要是为了克隆。假设您需要将一个对象的值分配给另一个对象而不是引用,这将正常工作。
已在此处讨论: 如何在 Java 中复制对象?
如果您的类将由(子)类派生,则这一点很重要。
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