gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:54 27 4
gpt4 key购买 nike

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

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