如果一个类包含一个对象作为实例变量,并且其中一个构造函数包含一个与参数类型相同的对象,那么最好将参数赋值给实例变量,或者从中创建一个新对象参数,并将新对象分配给实例变量。
以下是我正在进行的练习的一个例子:
public class MyCircle {
private MyPoint center; //contains variables int x and int y
private int radius;
//Non-controversial Constructor:
public MyCircle(int x, int y, int radius ) {
//creates new center using a valid MyPoint constructor
this.center = new MyPoint(x, y);
this.radius = radius;
}
//OPTION A
public MyCircle( MyPoint center, int radius ) {
this.center = center;
this.radius = radius;
}
//OPTION B
public MyCircle( MyPoint center, int radius ){
this.center = new MyPoint( center.getX(), center.getY() );
this.radius = radius;
}
}
最初,我键入了选项A,但我认为如果this.center
引用了可能无意间接修改的现有对象,则可能会产生错误行为。我想,另一种思考方式是创建一个创建共享中心的多个对象的途径,移动一个中心会故意移动共享该中心的所有圆圈。
答案 0 :(得分:0)
由于Java没有指针(至少不适用于开发人员),因此该选项将被丢弃,而不是可行的方法。 现在这个:
public MyCircle( MyPoint center, int radius ) {
this.center = center;
this.radius = radius; }
在我看来更好,你可以只分配中心而不需要制作MyPoint类的风险副本......而且我说有风险,因为如果你想这样做,你至少应该检查非 - 参数的无效条件......
你可以肯定地想......如果选项A中的中心为空,你是对的,那可能发生,然后你可以通过抛出非法参数,或者只是将该对象分配给默认值来处理它。 ..
但正如我之前所说,是我的意见..
答案 1 :(得分:0)
我认为这取决于你的计划。如果您希望圆圈具有对MyPoint
对象的引用,则必须传递它。否则,为什么不传递实际的x
和y
值。
例如,选项B可以写成:
public MyCircle(int x, int y, int radius) {
// rest
}
答案 2 :(得分:0)
两个选项都没问题,但正如你所说,一个对象可能会在时间上发生变化,当你想同时修改多个对象中的中心时,选项A就可以了,例如在圆圈列表中,但如果你想拥有独特且独立的中心点,选项B是正确的。所以你为什么不同时拥有这两个构造函数,并根据你的应用程序中的许多情况使用一个或另一个,使用你想要的任何你认为更好的,保持两者,这是我的建议。
希望对你有所帮助。