Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用;这";在另一个构造函数中_Java_Constructor_This - Fatal编程技术网

Java 使用;这";在另一个构造函数中

Java 使用;这";在另一个构造函数中,java,constructor,this,Java,Constructor,This,假设您有一个具有此构造函数的类: public SomeObj(int x, int y) { this.x = x; this.y = y; } 一切都好。但是现在如果你想克隆这个对象,我想让一个构造函数接受一个带有该类型对象的参数,这样在构造函数中所有(必要的)字段都可以被复制 public SomeObj(SomeObj objectToClone) { ... } 但现在,以下两种方法中哪一种更好?优点和缺点是什么(性能(字节码)、可读性 我个人同意后者 在可能的情况

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

public SomeObj(int x, int y) {
    this.x = x;
    this.y = y;
}
一切都好。但是现在如果你想克隆这个对象,我想让一个构造函数接受一个带有该类型对象的参数,这样在构造函数中所有(必要的)字段都可以被复制

public SomeObj(SomeObj objectToClone) { ... }
但现在,以下两种方法中哪一种更好?优点和缺点是什么(性能(字节码)、可读性


我个人同意后者


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

一旦添加另一个参数,后者就不再生成,让我们说
z
。如果采用第一种方法,您可能会忘记复制
z
。它仍然可以构建,但不能正常工作。

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


实际上,性能并没有受到影响,除非调用
this()
的微小间接影响会影响到您(我怀疑您甚至无法准确地测量这种差异)

如果使用第二个选项,则无需每次更改
public SomeObj(SomeObj objectToClone)
的实现时都更改
public SomeObj(int x,int y)
。所以它可以更好地避免重复代码。

它不是C++。从复制对象的对象类重写.clone()方法。这是真的

// 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)

+1。但它没有投票支持其中一个选项。从
clone
,我会亲自调用构造函数,而不是再次复制字段。clone()传统上不是用于深度复制吗?我认为只有在这种情况下才应该覆盖它。好吧,但问题不在于克隆的事情——这只是一个例子。它是关于将
这个(…)
传递给另一个构造函数。+1:让一个“真正”的构造函数调用所有其他的构造函数意味着构造函数之间的功能是一致的。在不同的构造函数中使用不同的代码可能是一场噩梦。虽然这只是关于这个主题的一个设想,但我愿意接受这个答案(即使你已经获得了很多分数和奖牌)。因为这个愿景让我对这一点有了一个清晰的认识。不要构建,但是编译器会给你错误,但是第一。。。。但如果你添加另一个参数,它就不起作用了。这就是我想指出的。我试图更清楚地表达自己。@Mudu:我不确定编译器是否将其内联,但是的,它可能!
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;
    }