我有一个单例对象,它在公共(public)库中实现了一些基本功能。它比这复杂得多,但为了记录问题,下面是 Singleton 实现,除了一个内部属性/对象外,所有的内部属性/对象都被删除:
package mystuff.lib.common
public class CommonSingleton {
public final static CommonSingleton INSTANCE = new CommonSingleton();
private Cache<String, Object> cache = null;
private CommonSingleton() {
// Exists only to defeat instantiation.
Initialize();
}
private void Initialize() {
cache = null;
}
public Cache<String, Object> getCache() {
if (cache == null) {
cache = new Cache<String, Object>();
}
return cache;
}
public void Reload() {
Initialize();
}
}
我已将该库包含在两个单独的项目中。该库未安装在运行代码的机器上。在 IntelliJ IDEA 中创建工件时,公共(public)库的内容包含在每个 JAR 中。
两个项目(JAR 文件)都在父应用程序中加载和运行(作为插件),因此它们都加载到同一个 JVM 中。我希望每个 JAR 都有自己的这个通用单例的副本,因为毕竟它们是独立的 JAR 文件。它只包含在一个公共(public)库中,因为我的许多项目都需要相同的功能,我宁愿在我的项目中包含该库,也不愿让代码的多个副本随处可见。
项目/模块 #1:TestPluginOne.JAR
package mystuff.plugins.TestPluginOne;
import mystuff.lib.common.CommonSingleton;
import mystuff.lib.common.Objects.Cache;
public class TestClassOne {
public TestClassOne() {
}
public Boolean SaveItemInCache(String key, String content) {
return CommonSingleton.INSTANCE.getCache().add(key, content, 30);
}
public void Reload() {
CommonSingleton.INSTANCE.Reload();
}
}
项目/模块 #2:TestPluginTwo.JAR
package mystuff.plugins.TestPluginTwo;
import mystuff.lib.common.CommonSingleton;
import mystuff.lib.common.Objects.Cache;
public class TestClassTwo {
public TestClassTwo() {
}
public String GetItemFromCache(String key) {
return CommonSingleton.INSTANCE.getCache().get(key);
}
public void Reload() {
CommonSingleton.INSTANCE.Reload();
}
}
但是,我发现当我在我的两个模块(请注意,单独的 JAR 文件)中使用该对象时,它们都在访问同一个单例。虽然这个带有 Cache 对象的特定示例可能没有说明任何问题,但我需要将它们视为单独的对象的原因有很多。有许多内部/私有(private)成员变量需要包含不同的值,具体取决于使用此单例的项目/模块/插件。
我很困惑。当我在 .NET 中(例如)在单独的 DLL 中执行此操作时,每个 DLL 维护它自己的该公共(public)对象的内部实例。
如何在不共享单例对象实例的情况下,将此通用单例功能包含在公共(public)库中的单独项目中?
谢谢!
最佳答案
/* the evil of singletons 的一个很好的例子. */
恐怕只要同一个类试图被同一个类加载器加载,这个类就只会被加载一次。无论涉及哪些 jar:与 DLL 不同,jar 只是文件系统的签名扩展。
我能想到的最简单的(关于所需的代码更改)是在每个插件中子类化您的单例,以便实例化一个单独的类,具有单独的状态。
否则,您可以显式初始化实例或使用依赖注入(inject)为您提供实例。
关于java - 如何在多个模块中的公共(public)库中使用 Singleton 而不会发生冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21655719/