我正在寻找一种更好的模式来实现这样的事情:
public static enum Foo {
VAL1( new Bar() ),
VAL2( new FooBar() );
private final bar;
private Foo( IBar bar ) {
this.bar = bar;
}
public IBar getBar() { return bar; }
}
问题是访问enum
原因的副作用。说Bar
打开一个数据库连接等。所以即使我只是需要VAL2
,我也必须付出代价来设置VAL1
。
OTOH, 的值bar
与enum
. 它就像一个静态属性,但enum
没有延迟初始化。我可以制作Foo.getBar()
抽象类并使用匿名类,但是我每次都必须支付设置费用。
有没有一种便宜的方法来为enum
s 的属性添加惰性初始化?
[编辑]为了明确这一点:
getBar()
被称为数百万次。它一定是快速致盲。我们在这里谈论单例(就像
enum
它本身一样)。只能创建一个实例。对于附加点,单元测试应该能够覆盖此行为。
实例必须延迟创建。
我们尝试在 Spring 中将值注册为 bean 的一种解决方案:
<bean id="VAL1.bar" class="...." />
这允许我们在运行时指定值并在测试中覆盖它们。不幸的是,这意味着我们必须以某种方式ApplicationContext
注入。enum
所以我们需要一个全局变量。畏缩
更糟糕的是:查找价值getBar()
太慢了。我们可以synchronize
getBar()
并使用if(bar!= null)bar=context.get(name()+".bar");
来解决这个问题。
但是有没有一种方法可以像使用这些enum
值本身一样安全和快速?