Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何强制java对象按特定顺序实例化其实例变量?_Java_Oop_Instance Variables - Fatal编程技术网

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

如何强制java对象按特定顺序实例化其实例变量?,java,oop,instance-variables,Java,Oop,Instance Variables,有一门课: class Test { Object1 object1; Object2 object2; void setObject2 (Object2 newObject) { if (object1.someMethod()) { this.object2 = newObject; } else { someOtherMethod(); } } } 如何强制对象实例化object1必须在object2之前实例化 现在我可

有一门课:

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的方法引发异常

有没有其他更合适的方法来实现这一目标


我之所以需要它,是因为我必须为一个地区object1创建新的广告活动测试,以宣传该地区的一些网站object2。在将站点添加到活动之前,我想检查站点是否属于该区域。

您可以限制object2的初始化,以便仅在对象已被初始化时才能实例化它

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

您可以限制object2的初始化,使其仅在对象已初始化时才能实例化

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

是的,应该使用构造函数将变量初始化到适当的状态,您实际上可以创建一个测试类构造函数,以实现如下所示的相同功能:

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

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

是的,应使用构造函数将变量初始化为适当的状态,实际上,您可以创建一个测试类构造函数来实现如下所示:

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

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

一种更简洁的设计方式是使用生成器模式。通过这种方式,您可以仅以正确的方式设置和创建对象,而不必在运行时获取异常


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

更简洁的设计方法是使用Builder模式。通过这种方式,您可以仅以正确的方式设置和创建对象,而不必在运行时获取异常



程序员不需要阅读文档或错误消息来了解他需要做什么,因为API本身就起指导作用。

我可以问一下你的目的吗?@acornagl你在问我吗?@Itamagreen不,很抱歉,我要求Marcin,但@@acornagl出了问题。我必须为一个地区创建新的广告活动,为该地区的一些网站做广告。在我将网站添加到活动之前,我想检查该网站是否属于该地区。@MarcinKruglik我明白了。我可以问一下你的目的吗?@acornagl你在问我吗?@Itamagreen不,很抱歉,我要求Marcin,但@@acornagl出了问题。我必须为一个地区创建新的广告活动,为该地区的一些网站做广告。在将站点添加到活动之前,我想检查该站点是否属于该区域。@MarcinKruglik,我明白了。上面的内容是正确的,此外,该方法还可以抛出java.lang.IllegalStateException,因此处理该类的人员知道有些事情出了问题。IllegalStateException:表示方法在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。这是一个坏主意,因为调用方无法知道对setter的调用没有任何效果。@Bohemian修复它。实施srinath的idea@ItamarGreen或者您可以让它返回一个布尔值,以指示操作是否成功结束。@aleb2000无需,如果用户收到异常,他们知道上面的错误是正确的,另外该方法可以抛出java.lang.IllegalStateException,所以在班上工作的人知道有些事情搞砸了。IllegalStateException:表示方法在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。这是一个坏主意,因为调用方无法知道对setter的调用没有任何效果。@Bohemian修复它。实施srinath的idea@ItamarGreen或者您可以让它返回一个布尔值,以指示操作是否成功结束。@aleb2000无需,如果用户收到异常,他们知道出错的原因。实际上,我在实际代码中使用了生成器模式。我试图使我的问题一般化,而不是拘泥于具体情况。即使我使用生成器,我也需要使用一些算法来检查实例变量的实例化顺序是否正确。我试图使我的问题一般化,而不是拘泥于具体情况。即使我使用生成器,我也需要使用一些算法来检查实例变量的实例化顺序是否正确。如果使用构造函数,则会引发异常
始终obj1始终为空为什么obj1始终为空?抱歉,我以为您指的是此。obj1。如果使用构造函数,则将始终引发异常obj1始终为空为什么obj1始终为空?抱歉,我以为您指的是此。obj1。