我只能提供模糊的解决方案。
先说一些解决方案:
要么做
private static final State state = Controller.initState();
或者使用控制反转,依赖注入,@Inject
. 这也将允许单元测试。网络上肯定有开源 DI 容器(Spring,还是 Pico 容器还在?)。或者从一些 DI 容器中请求 bean。
如果两者都为时过早,请进行惰性评估(部分静态初始化已经是惰性的)。有时会看到一个内部类:
private static class Singleton {
private static final State state = Controller.initState();
}
可能使用 getInstance。
我的选择:
不知何故没有静态,而是单例的吸气剂。一个 bean 框架与控制器一起工作。
单例而不是静态。
在之前的 eclipse 3 富客户端中大量使用的静态(静态函数),比如
IPreferenceStore store = IDEWorkbenchPlugin.getDefault().getPreferenceStore();
boolean autoPrint = store.getBoolean(AUTO_PRINT);
现在可以通过 OSGi 容器和注解进行依赖注入:
@Inject @Preference(AUTO_PRINT)
boolean autoPrint;
来自:Eclipse 4,M. Teufel 和 J. Helming 的 Rich Clients
除了更短之外,类之间的耦合更少,单元测试更容易编写,因为我们可以随心所欲地填写 autoPrint ,而不需要干预填充类。
如果有人犹豫添加这样一个容器的开销,最简单的方法是有几个静态的替代方案是拥有一个全局应用程序上下文,您可以在其中查找 java 对象,POJO bean。也许由 XML 文件支持:
State state = ApplicationContext.lookup(State.class, "state");
<bean name="state" class="org.anic.State" value="sleepy" depends="firstThis"/>
<bean name="firstThis .../>
请注意,不再需要静态。
Spring 框架有这样一种 XML 方法。
优点是集中初始化,可以考虑顺序和不同的工厂/创建方法。
(对不起,混乱的答案。)