0

例如,我应该使用:

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

那么我应该使用第一个构造函数吗?

4

6 回答 6

2

clone()通常被认为是 broken,我宁愿显式地对构造函数进行编码(或委托给构造方法,但是你不能final这么容易地使用它来强制执行不变性)。

为了解决您编辑的问题,您的构造函数是否需要传递实体的副本,而不是简单地引用原始参数?如果您要传入一个集合,您可能需要获取该集合的副本,并且可能需要该集合中包含的实体(这可能会也可能不会,具体取决于该实体的实现)。当然,如果您的原始实体是不可变的,那么没关系,您可以不受惩罚地传递引用。但是,您可能仍然担心复制集合,这样外部方不会更改该集合(重新排序、添加、删除等)

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

于 2013-10-07T10:27:45.920 回答
0

IMO 最好以clone()这种方式调用线路构造 - 而不是在承包商内部

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

更清楚,不会在构造函数中隐藏“按值”或“按引用”,而是让调用者决定。
除了使用(或不使用)克隆之外的所有注意事项(请参阅@Brian 回答)

于 2013-10-07T10:37:30.800 回答
0

不需要克隆不会调用。所以这里不需要它。检查这个http://www.tutorialspoint.com/java/lang/object_clone.htm

于 2013-10-07T10:30:50.217 回答
0

这取决于您要达到的目标。如果您想在 Line 中有一个向量的副本,或者只是引用它们。

可能 Vector 是不可变的,因此您可以轻松地引用它们。它会更容易和更快。

另请注意 Brian 对 clone() 方法的回答。

于 2013-10-07T10:34:33.220 回答
0

不确定您在寻找什么(标准实践、效率等)就效率而言,后一种不克隆的方法更好,因为它将避免创建现有对象的额外副本。但这一切都取决于你想从你的代码中得到什么。

如果要求这些对象在类doriginddir被修改的情况下不应该受到影响Line,那么克隆是一种选择,你应该更多地探索它。

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

于 2013-10-07T10:47:21.780 回答
0

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

public Line(Vector dorigin, Vector ddir) {origin = dorigin; dir = ddir;}
于 2013-10-07T10:29:49.807 回答