在另一个构造函数中使用“this”

时间:2012-03-08 11:47:37

标签: java constructor this

假设您有一个具有此构造函数的类:

public SomeObj(int x, int y) {
    this.x = x;
    this.y = y;
}

一切都好。但是现在如果你想克隆对象,我想要一个构造函数接受一个带有该类型对象的参数,所以在构造函数中可以复制所有(必要的)字段。

public SomeObj(SomeObj objectToClone) { ... }

但是现在以下哪两种方式更好?有哪些优点和缺点(性能(字节代码),可读性......)?

// 1
public SomeObj(SomeObj objectToClone) {
    this.x = objectToClone.x;
    this.y = objectToClone.y;
}

// 2
public SomeObj(SomeObj objectToClone) {
    this(objectToClone.x, objectToClone.y);
}

6 个答案:

答案 0 :(得分:13)

我会亲自与后者合作。

在可能的情况下,我尝试使一个构造函数具有“真实”的主体,并让所有其他人委托给它。这并不总是可能的 - 特别是,不同的构造函数可能需要委托给不同的超级构造器 - 但很高兴知道一个的地方你可以放置额外的初始化,日志记录,断点等等总是会受到攻击。

答案 1 :(得分:3)

2号更好。为什么?因为你不再重复自己,在两个不同的构造函数中设置一个成员。

确实没有性能受到影响,除非调用this()的微小额外间接对你产生影响(我怀疑你甚至可以准确地测量这种差异)。

答案 2 :(得分:2)

如果您使用第二个选项,则每次更改public SomeObj(SomeObj objectToClone)的实施时都不必更改public SomeObj(int x, int y)。因此它更好,因为它可以避免重复代码。

答案 3 :(得分:1)

一旦添加了另一个参数,后者就不再构建了,假设z。如果你采取第一种方法,你可能会忘记复制z。它仍在构建,但无法正常工作。

答案 4 :(得分:1)

这不是C ++。从Object类覆盖复制对象的.clone()方法。这是真的方式

答案 5 :(得分:0)

// 1
public SomeObj(SomeObj objectToClone) {
    this.x = objectToClone.x;
    this.y = objectToClone.y;
}

更好。

每次添加新参数时,您的第二个选项都需要您更新构造函数。此外,如果你必须在100个地方调用100个属性来列出每个构造函数,很明显它开始失去可读性。

我无法理解你为什么要将同一个对象的多个属性作为参数传递而不是传递对象。没有理由这样做。

比较这两个:

public SomeObj(SomeObj objectToClone) {
    this.x = objectToClone.x;
    this.y = objectToClone.y;
    this.z = objectToClone.z;
    this.p = objectToClone.p;
    this.s = objectToClone.s;
    this.a = objectToClone.a;
    this.b = objectToClone.b;
    }

然后在代码中调用SomeObj(obj) 10次。

代码中

SomeObj(obj.x,obj.y,obj.z,obj.p,obj.s,obj.t,obj.a,obj.b); 10次

此外,使用第二个选项,您无法保证所传递的参数符合您的要求,因此您可以得到以下内容: SomeObj(obj.x,obj.y,obj2.z,obj3.p,0,0,-1,null);