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



拥有一个类:

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();
  }
  ...

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

我需要它的原因是我必须为一个地区object1创建新的广告活动Test,为该地区的一些网站object2做广告。在我可以添加网站到活动之前,我想检查一下该网站是否属于该地区。

从设计角度来看,更简洁的方法是使用builder模式。这样,你就可以只以正确的方式设置和创建对象,而不会在运行时出现异常。

程序员不需要阅读文档或错误消息来找出他需要做什么,因为API自己做了"引导"。

你可以限制object2的初始化,这样它只能在object已经被实例化的情况下被实例化。

public void setObject2 (Object2 newObject) {
    if(object1 == null){ 
        throw new IllegalStateException();
    }else{
        this.object2 = newObject;
    }
}

是的,应该使用构造函数来初始化变量到适当的状态,您实际上可以创建一个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(如上所述),如果它的强制变量状态没有正确初始化,以便对象在创建后不会处于不一致状态。

相关内容

  • 没有找到相关文章

最新更新