java - 如何在多个模块中的公共(public)库中使用 Singleton 而不会发生冲突?

标签 java jar intellij-idea singleton

我有一个单例对象,它在公共(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/

相关文章:

java - 当我尝试在IntelliJ中运行Java类时,即使已成功编译并运行,也没有任何结果

java - 无法解析符号 Mock 或 InjectMocks

java - Java JIT 在运行 JDK 代码时会作弊吗?

java - 部署和连接云类型转换服务(MongoDB、Java、Spring Boot)

java - 为什么我不能在 Java 运行时使用日志文件

java - SWT-App 从可运行的 .jar 或外部文件夹加载 .swf 文件

JavaFX .jar 适用于 Windows 和 OSX,但不适用于 Linux

java - 在 jar 文件中查找文件时出现问题

java - 代码大纲的 IntelliJ 快捷方式

java - 使用 ASM 插入 FrameNode