2

确保在 java 中调用 init 方法的好方法是什么?我看到的替代方案是

  • 不要测试它,让方法自己失败,很可能是NullPointerException
  • 测试方法是否已初始化或抛出
public void foo() {
     if (!inited) {
         throw new IllegalArgumentException("not initalized");
     }
     ...
}
  • 德拉盖特
public void foo() {
     if (!inited) {
         throw new IllegalArgumentException("not initalized");
     }
     fooInternal();
}

private void fooInternal(){ ... };
  • 始终初始化,否则将 init 设为 noop
public void foo() {
     init();
     ...
}
public void init() {
     if(!inited) {
         ...
     }
}
  • 静默初始化
public void foo() {
     if (!inited) {
         init();
     }
     ...
}

这些方法中的大多数都非常冗长,并降低了整体可读性。

4

3 回答 3

5

如果初始化是使用合同抛出的一部分,IllegalStateException因为类的客户端没有导致它转换到正确的“初始化”状态......</p>

是否在创建时进行初始化取决于它的使用方式。例如,如果它可能被 Spring ApplicationContext 使用,那么您将需要推迟初始化。

于 2012-11-02T11:13:01.727 回答
2

init();在初始化块中调用,这样每个构造函数调用也将执行init();

于 2012-11-02T10:58:45.653 回答
2

大多数情况下,您希望快速失败,因此请根据您的应用程序在其中执行的容器选择帮助您快速失败的机制。例如,如果是 Web 容器,那么您可能会在创建servlet 上下文期间对其进行初始化。此外,我不确定为什么以下内容很冗长。它的意图简单、清晰和明确。

public void foo() {
     if (!inited) {
         init();
     }
     ...
}
于 2012-11-02T11:02:19.617 回答