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