2015-06-29 342 views
0

为了使豆类可测试我通常使用以下模式:最佳实践

class SomeClass { 

    private Something field = null; 

    @PostConstruct 
    public void init() { 
     if (field == null) 
      field = someClass.someValue; //(this may throw an exception, that's why it's here) 
    } 

    //Notice: this is package local 
    void setField(Something value) { 
     field = value; 
    } 
} 

我经常使用这种模式,所以我有一个默认的行为和行为测试中使用。 someClass.someValue通常会像传统代码中的静态方法那样令人讨厌,或者引发异常或两者兼而有之。

有人认为这有点破解,但我没有看到任何坏东西。

使用此模式的缺点是什么?

回答

0

您所使用的模式实际上是一个反模式:你正在连接你的代码的传统结构,实施细节等

而这违背了依赖注入(DI)和反转的原则控制(IoC)。

另一方面,春天是DI和IoC的支持者。

因此,更好的模式将总是使用DI为您的依赖关系,并删除这种情况下使用@PostConstruct

如果您需要调用静态工厂方法来创建对象Something,这不是一个问题:只需使用一个factory-method或自定义FactoryBean在XML配置或JavaConfig标准@Bean方法。然后将Something对象注入SomeClass作为必需的属性(例如,作为构造函数参数)。