gpt4 book ai didi

java - Java 中可配置的枚举

转载 作者:行者123 更新时间:2023-11-30 05:58:31 28 4
gpt4 key购买 nike

我正在寻找更好的模式来实现这样的事情:

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 的属性添加延迟初始化是吗?

[编辑]要明确这一点:

  1. getBar()被调用了数百万次。速度一定快得让人眼花缭乱。

  2. 我们这里讨论的是单例(就像 enum 本身)。只能创建一个实例。

    对于其他要点,单元测试应该能够覆盖此行为。

  3. 实例必须延迟创建。

我们尝试的一个解决方案是在 Spring 中将值注册为 bean:

<bean id="VAL1.bar" class="...." />

这使我们能够在运行时指定值并在测试中覆盖它们。不幸的是,这意味着我们必须注入(inject) ApplicationContext进入enum不知何故。所以我们需要一个全局变量。 畏缩

更糟糕的是:查找 getBar() 中的值太慢了。我们可以synchronize getBar()并使用if(bar!= null)bar=context.get(name()+".bar");来解决这个问题。

但是有没有一种方法可以不使用此方法,并且与使用 enum 一样安全且快速?值(value)观本身?

最佳答案

只需用抽象工厂模式替换枚举即可。

UPD:您可以尝试这样的操作:

public interface Factory {
IBar getBar();
}

public class BarFactory implements Factory {

private IBar barInstance;

public synchronized IBar getBar() {
if (barInstance == null) {
barInstance = new Bar();
}
return barInstance;
}
}

public class FooBarFactory implements Factory {

private IBar barInstance;

public synchronized IBar getBar() {
if (barInstance == null) {
barInstance = new FooBar();
}
return barInstance;
}
}

您可以尝试以某种方式优化同步部分,但这种方式可能会根据您的具体用例而有所不同。

关于java - Java 中可配置的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224602/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com