Java 在Eclipse中使用指定的类加载器加载单例

Java 在Eclipse中使用指定的类加载器加载单例,java,enums,eclipse-plugin,singleton,classloader,Java,Enums,Eclipse Plugin,Singleton,Classloader,我的项目有点小问题。 我们为服务器开发了一个客户端作为eclipse插件 在这里,我们有一个“ApplicationRegistry”,它只不过是一个映射,它保存了我们只需要一次但不应该是单例的所有对象。这个ApplicationRegistry是作为enum singleton和其他插件中的一些东西实现的。到目前为止一切正常 现在,客户需要不同的“透视图”,这些“透视图”显示出稍微不同的功能。这也没有问题。到目前为止,我们只有两个Runnable和两个不同的菜单项来启动这两个不同的类,但是将它

我的项目有点小问题。 我们为服务器开发了一个客户端作为eclipse插件

在这里,我们有一个“ApplicationRegistry”,它只不过是一个映射,它保存了我们只需要一次但不应该是单例的所有对象。这个ApplicationRegistry是作为enum singleton和其他插件中的一些东西实现的。到目前为止一切正常

现在,客户需要不同的“透视图”,这些“透视图”显示出稍微不同的功能。这也没有问题。到目前为止,我们只有两个Runnable和两个不同的菜单项来启动这两个不同的类,但是将它们分成两个或三个插件是没有问题的(可能会更好)

现在我来谈谈问题:我们可以同时运行这两个透视图。但是ApplicationRegistry是由它自己插件的类加载器创建的,因此我们所有的透视图都只存在一次。因此,当我们尝试在第一个透视图中打开一个新选项卡时,它会在第二个透视图中打开

长话短说:插件“parent1”和“parent2”在插件“child”中使用了一个单例,并以一种不受欢迎的方式相互影响。 我的想法是用各自的类加载器将单例加载到每个父插件中。但是,由于我不知道如何使用指定的类加载器加载枚举单例,所以我无法验证此解决方案是否可以做到这一点

有谁能告诉我如何使用指定的类加载器加载枚举单例(以及是否正确的ApplicationRegistry将在每个插件中进一步得到解决),这是否可行,或者是否有另一个解决方案不涉及整个项目中的大规模重新设计

谢谢,
Sebastian

不要用多个类加载器加载同一个枚举。你会为此下地狱的(就是运行时错误地狱)。虽然enum singleton/multiton对于简单的任务非常有用,但它们不能扩展到这样的目的。两种可能的解决办法

a) 每个透视图使用一个枚举(即透视图必须“知道”要查找的枚举

b) 让枚举项“知道”它们属于哪个透视图(为透视图使用第二个枚举):

公共枚举透视图{
A、 B,C
}
公共枚举事件{
FOO(透视图A、透视图B),
BAR(透视图C),
BAZ(透视图A、透视图B、透视图C),
;
私人最终观点[]观点;
私人事物(透视图…透视图){
这个。透视图=透视图;
}
透视图的公共静态集(透视图p){
Set=EnumSet.noneOf(Perspective.class);
对于(Thing t:values()){
if(EnumSet.of(t.perspecties).contains(p)){set.add(t);}
}
返回t;
}
}

不要用多个类加载器加载同一个枚举。你会为此下地狱的(就是运行时错误地狱)。虽然enum singleton/multiton对于简单的任务非常有用,但它们不能扩展到这样的目的。两种可能的解决办法

a) 每个透视图使用一个枚举(即透视图必须“知道”要查找的枚举

b) 让枚举项“知道”它们属于哪个透视图(为透视图使用第二个枚举):

公共枚举透视图{
A、 B,C
}
公共枚举事件{
FOO(透视图A、透视图B),
BAR(透视图C),
BAZ(透视图A、透视图B、透视图C),
;
私人最终观点[]观点;
私人事物(透视图…透视图){
这个。透视图=透视图;
}
透视图的公共静态集(透视图p){
Set=EnumSet.noneOf(Perspective.class);
对于(Thing t:values()){
if(EnumSet.of(t.perspecties).contains(p)){set.add(t);}
}
返回t;
}
}

好吧,这将导致我试图避免的大规模重新设计,因为我必须调整每个调用。我希望有一个简单而干净的可能性,因为据我所知,类似的事情在Web服务器上也会发生。好吧,这将导致一个巨大的重新设计,我试图避免,因为我将不得不适应每一个调用。我希望有一个简单而干净的可能性,因为据我所知,在Web服务器中也有类似的操作。
public enum Perspective{
    A, B, C
}

public enum Thing{

    FOO(Perspective.A, Perspective.B),
    BAR(Perspective.C),
    BAZ(Perspective.A, Perspective.B, Perspective.C),
    ;
    private final Perspective[] perspectives;
    private Thing(Perspective ... perspectives){
      this.perspectives=perspectives;
    }

    public static Set<Thing> forPerspective(Perspective p){
        Set<Perspective> set = EnumSet.noneOf(Perspective.class);
        for(Thing t : values()){
            if(EnumSet.of(t.perspectives).contains(p)){set.add(t);}
        }
        return t;
    }
}