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

How to force java object to instantiate it's instance variables in specific order?

提问人:blekione 提问时间:11/6/2016 最后编辑:blekione 更新时间:11/7/2016 访问量:801

问:

上课:

class Test {

  Object1 object1;
  Object2 object2;

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

如何强制之前必须实例化的对象实例化?object1object2

现在我可以考虑解决它

1.by make constructor with as parameter 并在那里实例化它Object2

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

2.by 从尝试设置的方法抛出异常object2

void setObject2 (Object newObject) {
  if (object1 == null) {
    throw new Exception();
  }
  ...

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

我需要它的原因是我必须为一个地区创建新的广告活动来宣传该地区的一些网站。在将网站添加到广告系列之前,我想检查该网站是否属于该地区。Testobject1object2

Java OOP 实例变量

评论

0赞 acornagl 11/6/2016
我能问你你的目的是什么吗?
0赞 ItamarG3 11/6/2016
你问我@acornagl?
0赞 acornagl 11/6/2016
@ItamarGreen不,对不起,我问了Marcin,但出了点问题@
1赞 blekione 11/6/2016
@acornagl我必须为一个地区创建新的广告活动,以宣传该地区的一些网站。在将网站添加到广告系列之前,我想检查该网站是否属于该地区。
1赞 ItamarG3 11/6/2016
@MarcinKruglik我明白了。

答:

3赞 ItamarG3 11/6/2016 #1

您可以限制 的初始化,以便只有在已实例化的情况下才能实例化它。object2object

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

评论

1赞 Srinath Ganesh 11/6/2016
上面是正确的,此外该方法可以抛出 java.lang.IllegalStateException,因此处理该类的人知道某些东西被搞砸了。IllegalStateException:表示在非法或不适当的时间调用了方法。换言之,Java 环境或 Java 应用程序不处于请求操作的适当状态。
0赞 Bohemian 11/6/2016
这是一个坏主意,因为调用方无法知道对 setter 的调用没有效果。
0赞 ItamarG3 11/6/2016
@Bohemian修复它。实现 Srinath 的想法
0赞 aleb2000 11/6/2016
@ItamarGreen,或者你可以让它返回一个布尔值,以指示操作是否成功结束。
0赞 ItamarG3 11/6/2016
@aleb2000没有必要,如果用户收到异常,他们就知道出了什么问题
0赞 Vasu 11/6/2016 #2

是的,应该使用构造函数将变量初始化到适当的状态,您实际上可以创建一个 来实现如下所示的相同目标: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

评论

0赞 blekione 11/6/2016
如果使用构造函数,则将始终抛出异常(obj1 始终为 null)
0赞 Vasu 11/6/2016
为什么 obj1 总是 null ?
0赞 blekione 11/6/2016
对不起,我以为你指的是.this.obj1
3赞 Kayaman 11/6/2016 #3

一种更简洁的设计方式是使用 Builder-pattern。这样,您就可以仅以正确的方式设置和创建对象,而不会在运行时出现异常。

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

评论

0赞 blekione 11/6/2016
实际上,我在实际代码中使用了 Builder-pattern。我试图使我的问题具有普遍性,而不是与具体情况绑定。即使我使用构建器,我也需要使用一些算法来检查实例变量是否以正确的顺序实例化。