用于SpringDI的Java静态最终备选方案

用于SpringDI的Java静态最终备选方案,java,spring,dependency-injection,Java,Spring,Dependency Injection,我有一个类,我想拥有静态final变量 public static final Map<String, Long> ID_MAP; 然而,这意味着另一个类可以来更改该值。有没有其他选择,我可以试试。我曾考虑将Map作为一个final字段,但我仍然需要弄清楚如何将Map以及可能需要标记为final的其他变量传递给getInstance方法。此外,我还努力寻找最简单、最简单的解决方案。将映射设为字段并注入一个单例。将映射设为字段并注入一个单例。如果您担心外部类在Spring设置值后更

我有一个类,我想拥有
静态final
变量

public static final Map<String, Long> ID_MAP; 

然而,这意味着另一个类可以来更改该值。有没有其他选择,我可以试试。我曾考虑将Map作为一个
final
字段,但我仍然需要弄清楚如何将Map以及可能需要标记为
final
的其他变量传递给
getInstance
方法。此外,我还努力寻找最简单、最简单的解决方案。

将映射设为字段并注入一个单例。

将映射设为字段并注入一个单例。

如果您担心外部类在Spring设置值后更改该值,您可以在类中集成一个只允许该字段设置一次的标志。假设您将名为“CAN\u SET\u ID\u MAP”的静态
AtomicBoolean
初始化为true。然后,在地图的setter中:

if (CAN_SET_ID_MAP.compareAndSet (true, false)) {
  ID_MAP = iDMapSpring;
} else {
  throw new IllegalStateException ("ID_MAP already set");
}

还有其他方法可以做到这一点。不管怎样,您可能都希望使用线程安全的保护形式。

如果您担心外部类在Spring设置值后更改它,您可以在类中集成一个只允许字段设置一次的标志。假设您将名为“CAN\u SET\u ID\u MAP”的静态
AtomicBoolean
初始化为true。然后,在地图的setter中:

if (CAN_SET_ID_MAP.compareAndSet (true, false)) {
  ID_MAP = iDMapSpring;
} else {
  throw new IllegalStateException ("ID_MAP already set");
}

还有其他方法可以做到这一点。不管怎样,您可能都希望使用线程安全的保护形式。

该类是单例还是映射<代码>公共类SingletonID{Map Map;私有静态getInstance(Map aMap){if(theInstance==null)等该映射将是singleton。这就是使其成为静态字段的真正含义:“只有一个这样的映射”这会涉及使用
getBean(“mapSingleton”)吗
或者在我的类中类似的东西?我问的原因是b/c我正在使用GWT,这将是一个共享类,这意味着不能使用外部JAR,因为它都被GWT转换为javaScript。我知道spring Bean默认为单例,我不知道如何在不使用外部库的情况下使映射成为单例对类进行定义。如何进行注入完全取决于您。您可以将其传递到构造函数中,您可以配置Spring来进行注入。什么最适合您的应用程序的其余部分。我不能就GWT提出建议,认为类是singleton还是map?
公共类SingletonID{map map;私有静态getInstance(map aMap){if(instance==null)等。
映射将是单例。这就是使其成为静态字段的真正含义:“只有一个这样的映射”这会涉及使用
getBean(“mapSingleton”)吗
或者在我的类中类似的东西?我问的原因是b/c我正在使用GWT,这将是一个共享类,这意味着不能使用外部JAR,因为它都被GWT转换为javaScript。我知道spring Bean默认为单例,我不知道如何在不使用外部库的情况下使映射成为单例nside类。如何进行注入完全取决于您。您可以将其传递到构造函数中,您可以配置Spring来进行注入。什么最适合您的应用程序的其余部分。我不能建议GWT,因为最简单和最不复杂的解决方案将是使映射成为非最终的。从某种意义上说,它确实不是最终的,因为它正在改变最简单和最不复杂的解决方案是使映射成为非最终的。从某种意义上说,它实际上并不是最终的,因为它在运行时被更改。