2012-11-02 62 views
2

什么,以确保一个init方法是Java调用的好方法吗?我看到的替代品的Java init方法

  • 不要测试了,如果让方法初始化的方法本身出现故障,很可能是由NullPointerException
  • 测试或抛出
public void foo() { 
    if (!inited) { 
     throw new IllegalArgumentException("not initalized"); 
    } 
    ... 
} 
  • Delagate
public void foo() { 
    if (!inited) { 
     throw new IllegalArgumentException("not initalized"); 
    } 
    fooInternal(); 
} 

private void fooInternal(){ ... }; 
  • 总是初始化,使初始化一个空操作,否则
public void foo() { 
    init(); 
    ... 
} 
public void init() { 
    if(!inited) { 
     ... 
    } 
} 
  • 默默的init
public void foo() { 
    if (!inited) { 
     init(); 
    } 
    ... 
} 

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

+0

是什么'的init()'实际上呢?是否需要为每个类的每个实例调用它或每个应用程序调用一次?你不能把相关的代码放到类的构造函数中吗? –

+0

好问题,我想一个'INIT-once'类型的行为 –

+0

您可以使用一个静态初始化块对一个类进行一次初始化。 –

回答

5

如果初始化是使用合同扔IllegalStateException的一部分,因为类的客户端并没有引起它过渡到正确的“初始化”状态......

无论您初始化在创建或不依赖于它如何被使用。举例来说,如果一个可能性是,可以使用Spring的ApplicationContext那么你会希望推迟初始化。

2

调用init();如果是初始化块,那么每个构造函数调用也将执行init();

2

大多数时候,你想fail fast因此选择,可以帮助你快速失败根据您的应用程序在执行容器的机制的时间。对于e.g如果Web容器那么可能是你创造的servlet context期间初始化。而且,我不确定为什么下面是冗长的。它的意图简单明了,明确。

public void foo() { 
    if (!inited) { 
     init(); 
    } 
    ... 
}