如何强制java对象按特定顺序实例化它的实例变量?

时间:2016-11-06 13:05:37

标签: java oop instance-variables

上课:

class Test {

  Object1 object1;
  Object2 object2;

  void setObject2 (Object2 newObject) {
    if (object1.someMethod()) {
      this.object2 = newObject;
    } else {
      someOtherMethod();
    }
  }
}

如何在object1之前强制object2必须实例化的对象实例化?

现在我可以考虑解决它

1.通过使用Object2作为参数构造构造函数并在那里实例化

Test(Object1 object1) {
  this.object1 = object1;
}

2.从尝试设置object2

的方法中抛出异常
void setObject2 (Object newObject) {
  if (object1 == null) {
    throw new Exception();
  }
  ...

有没有其他更合适的方法来实现它?

我需要它的原因是我必须为区域Test创建新的广告系列object1,以宣传该地区的某些网站object2。在我将网站添加到广告系列之前,我想检查网站是否属于该区域。

3 个答案:

答案 0 :(得分:3)

您可以限制object的初始化,以便只有在public void setObject2 (Object2 newObject) { if(object1 == null){ throw new IllegalStateException(); }else{ this.object2 = newObject; } } 时才会实例化。

{{1}}

答案 1 :(得分:3)

设计方面更清晰的方法可以是使用Builder模式。这样,您只能以正确的方式设置和创建对象,而不是在运行时获取异常。

程序员不需要阅读文档或错误消息来找出他需要做什么,因为API会执行指导"本身。

答案 2 :(得分:0)

是的,将变量初始化为适当的状态应该使用构造函数来完成,你实际上可以创建一个Test class constructor来实现如下所示:

public Test(Object1 obj1, Object2 obj2) {
    //if objects are null throw an error
    if(obj1 == null) {
       throw IllegalStateException("Invalid Object1 passed");
    } else {
      this.obj1 = obj1;
     //check someMethod() returns true and then set object2
     if (obj1.someMethod()) {
      this.obj2 = obj2;
     } else {
       //obj1.someMethod() is false, call someOtherMethod()
       someOtherMethod();
    }
  }

最好从构造函数中抛出Exception(如上所述),如果强制变量state未正确初始化,则对象在创建后不会处于不一致状态。