例如,我应该使用:
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
然后我应该使用第一个构造函数?
答案 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”,但让调用者决定。
关于使用(或不使用)克隆的所有考虑因素(参见@Brian答案)
答案 5 :(得分:0)
不确定您在寻找什么(标准练习,效率等)。就效率而言,后一种不克隆的方法更好,因为它会避免创建现有对象的其他副本。 但这一切都取决于您对代码的要求。
如果要求对象dorigin
和ddir
不会受到影响,以防这些对象在Line
类中被修改,那么克隆是您的选择,您应该更多地探索它
否则,如果没有这样的要求,那么最好使用克隆。