构造函数参数中的对象:创建新实例或分配指针?

时间:2016-04-14 21:32:34

标签: java pointers object arguments

如果一个类包含一个对象作为实例变量,并且其中一个构造函数包含一个与参数类型相同的对象,那么最好将参数赋值给实例变量,或者从中创建一个新对象参数,并将新对象分配给实例变量。

以下是我正在进行的练习的一个例子:

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引用了可能无意间接修改的现有对象,则可能会产生错误行为。我想,另一种思考方式是创建一个创建共享中心的多个对象的途径,移动一个中心会故意移动共享该中心的所有圆圈。

3 个答案:

答案 0 :(得分:0)

由于Java没有指针(至少不适用于开发人员),因此该选项将被丢弃,而不是可行的方法。 现在这个:

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

在我看来更好,你可以只分配中心而不需要制作MyPoint类的风险副本......而且我说有风险,因为如果你想这样做,你至少应该检查非 - 参数的无效条件......

你可以肯定地想......如果选项A中的中心为空,你是对的,那可能发生,然后你可以通过抛出非法参数,或者只是将该对象分配给默认值来处理它。 ..

但正如我之前所说,是我的意见..

答案 1 :(得分:0)

我认为这取决于你的计划。如果您希望圆圈具有对MyPoint对象的引用,则必须传递它。否则,为什么不传递实际的xy值。

例如,选项B可以写成:

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

答案 2 :(得分:0)

两个选项都没问题,但正如你所说,一个对象可能会在时间上发生变化,当你想同时修改多个对象中的中心时,选项A就可以了,例如在圆圈列表中,但如果你想拥有独特且独立的中心点,选项B是正确的。所以你为什么不同时拥有这两个构造函数,并根据你的应用程序中的许多情况使用一个或另一个,使用你想要的任何你认为更好的,保持两者,这是我的建议。

希望对你有所帮助。