2016-04-14 49 views
0

如果一个类包含一个对象作为一个实例变量,而其中一个构造函数包含一个与参数类型相同的对象,最好的做法是将参数赋值给实例变量,或者从该变量创建一个新对象参数,并将THE NEW OBJECT赋值给实例变量。构造函数参数中的对象:创建新实例还是指定指针?

下面是一个锻炼我正在通过一个例子:

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

这里没有真正的最佳实践,因为您可能希望调用代码能够修改中心。或者你没有。你也可以确保一个“MyPoint”是不可变的,所以“x”和“y”的值不能被改变,这也将消除复制“MyPoint”到构造函数。 – f1sh

回答

0

由于Java没有指针(至少对于开发人员)该选项将被丢弃,是不是要走的路.. 现在这个:

public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; } 

在我看来是更好的,你可以分配中心,并且不需要制作MyPoint的冒险副本......而且我说冒险,因为如果你想这样做,你至少应该检查该参数的非空值条件......

你可以肯定地认为......如果选项A中的中心为空,你是对的,那可能发生,那么你可以通过抛出一个非法列表来处理它ameterexception,或只是将该对象分配给默认值。 ..

但正如我之前说的是我的看法..

+0

谢谢。我没有意识到“指针”就是这样一个特定的术语。这个问题实际上应该是“......创建一个新对象或为现有对象分配一个引用”?我也很感谢MyPoint或其他类似对象可能为空的警告。 –

0

我认为这取决于你的程序。如果您希望该圆圈有对MyPoint对象的引用,那么您必须通过它。否则,为什么不自己传递xy值。

例如,B选项可以写成:

public MyCircle(int x, int y, int radius) { 
    // rest 
} 
0

两个选项都很好,但你说,一个对象可以在时间而改变,当你要修改的选项A是OK同时在一个以上的对象中居中,例如在一个圆圈列表中,但是如果你想拥有独特而独立的中心点,则选项B是正确的。所以你为什么不具备两个构造函数,并根据应用中的许多情况使用一个或另一个构造函数,使用任何你想要的更好的方法,保留两者,这是我的建议。

希望它对你有帮助。