我应该在构造函数中使用.clone()吗?

时间:2013-10-07 10:26:05

标签: java

例如,我应该使用:

public Line(Vector dorigin, Vector ddir) 
{
    origin = dorigin.clone(); 
    dir = ddir.clone();
} 

而不是:

public Line(Vector dorigin, Vector ddir) 
{
     origin = dorigin; 
     dir = ddir;
}

???

所以,假设我有一个这样的程序: Line [] line = new Line [10];

for (i = 0; i < n; i++)
{
    Vector temp = new Vector(i, 0);
    line[i] = new Line(temp, temp);
}
//and then operate on the array line

然后我应该使用第一个构造函数?

6 个答案:

答案 0 :(得分:2)

clone()often regarded as broken,我宁愿显式编写构造函数(或委托给构造方法,但是你不能利用final来如此轻松地强制执行不变性)。

要解决您编辑的问题,您的构造函数是否需要副本传递的实体,而不是简单地引用原始参数?如果您正在传递集合,则可能需要获取集合的副本以及可能包含该集合中包含的实体(根据该实体的实现可能会也可能不会)。当然,如果您的原始实体是不可变的,那么它无关紧要,您可以传递引用而不受惩罚。但是,您可能仍然担心复制集合,以致外部方不会更改该集合(重新排序,添加,删除等)。

谁真正拥有这些数据?是一个关键问题。

答案 1 :(得分:0)

如果原点是Line类的实例,则应使用

public Line(Vector dorigin, Vector ddir) {origin = dorigin; dir = ddir;}

答案 2 :(得分:0)

没有必要克隆不会打电话。这里不需要它。 检查此http://www.tutorialspoint.com/java/lang/object_clone.htm

答案 3 :(得分:0)

这取决于你将要实现的目标。如果你想在Line中有一个向量副本或只是引用它们。

可能Vector是不可变的,所以你可以很容易地只引用它们。它会更容易,更快。

还要注意Brian关于clone()方法的答案。

答案 4 :(得分:0)

IMO最好在行构造中调用clone() - 而不是在构造函数内 - 以这种方式调用

Line l = new Line(dorigin.clone(), ddir.clone());

更清晰,不会在构造函数中隐藏“by value”或“by ref”,但让调用者决定。
关于使用(或不使用)克隆的所有考虑因素(参见@Br​​ian答案)

答案 5 :(得分:0)

不确定您在寻找什么(标准练习,效率等)。就效率而言,后一种不克隆的方法更好,因为它会避免创建现有对象的其他副本。 这一切都取决于您对代码的要求。

如果要求对象doriginddir不会受到影响,以防这些对象在Line类中被修改,那么克隆是您的选择,您应该更多地探索它

否则,如果没有这样的要求,那么最好使用克隆。