2011-04-21 63 views
7

如何构建接收另一个点(x,y)并复制其值的复制构造函数?在Java中构建复制构造函数

我决定签字:public Point1 (Point1 other),但我不知道在写......

Point类的样子:

public class Point1 

{ 
    private int _x , _y;  
    public Point1 (Point1 other) 
    { 
     ... 
     ... 
    } 
//other more constructors here... 

} 

我想:

public Point1 (Point1 other) 
{ 
    _x = other._x ; 
    _y = other._y; 
} 

但我几乎可以肯定我可以做得更好..

日Thnx

+0

@Master C,我想你的意思是在你的例子中有'public Point1(Point1 other)',不是吗? – 2011-04-21 20:07:08

+2

一个'Point'就是一个经常应该是不变的东西的例子,在这种情况下,实际上复制一个就不是必须的了。 – ColinD 2011-04-21 20:07:17

+1

你为什么认为这应该是其他方式?所有复制构造函数应该做的就是复制其他对象的字段的值。 – uckelman 2011-04-21 20:08:20

回答

16

不,你的

public Point1(Point1 other) 
{ 
    _x = other._x ; 
    _y = other._y; 
} 

尝试是绝对没问题...(我已经纠正参数类型。)

我会忍不住做出_x_y最后,并使类最终,但那是因为我喜欢不可变类型。其他人肯定有不同的意见:)

克隆继承层次结构有点棘手 - 层次结构中的每个类必须有一个相关的构造函数,传递给它的任何参数给超类构造函数,然后复制它自己的字段。例如:

public class Point2 extends Point1  
{ 
    private int _z; 
    public Point2(Point2 other) 
    { 
     super(other); 
     this._z = other._z; 
    } 
} 

这不是在实施方太糟糕,但如果你想忠实地复制你需要一个Point2知道它以调用正确的构造是一个Point2

实现Cloneable允许这样做更简单一点,但还有其他的事情要考虑......基本上克隆对象并不像看起来那么简单:)(我确信有条目如果你没有副本,现在购买一个。)

+0

同意。你还能做什么? – 2011-04-21 20:07:04

+0

很好的答案,我确信有效的java建议复制构造函数而不是克隆。我还建议摆脱变量名称中不必要的“_”字符,但那就是,像是,和意见男人 – 2011-04-21 20:20:04

+0

@Java:是的,我也不喜欢_我自己,但我想我不会尝试改变OP的风格* too * much :) – 2011-04-21 20:31:10