2011-07-04 15 views
1

我的項目中存在一個小問題。 我們爲我們的服務器開發一個客戶端作爲eclipse插件。在Eclipse中使用指定的類加載器加載單例子

在那裏,我們有我們的'ApplicationRegistry',它只是一張地圖,它只包含我們需要的所有對象一次,但不應該是單身。這個ApplicationRegistry是作爲enum單例實現的,以及另一個插件中的其他東西。到目前爲止一切正常。

現在,客戶需要不同的'視角',它們顯示出略有不同的特徵。這也沒有問題。到目前爲止,我們只有兩個runnables和兩個不同的菜單條目來啓動兩個不同的類,但將它們分成兩個或三個插件是沒有問題的(可能會更好)。

現在我來回答這個問題:我們可以同時運行這兩種觀點。但ApplicationRegistry是由它自己的插件的類加載器創建的,因此我們所有的觀點都存在一次。因此,當我們嘗試在第一個視角中打開新選項卡時,它會在第二個視圖中打開。長話短說:插件'parent1'和'parent2'在插件'child'中使用單例,並以不希望的方式相互影響。 我的想法是使用自己的類加載器在每個父插件中加載單例。但由於我不知道如何使用指定的類加載器加載枚舉單例,我無法驗證此解決方案是否可以實現。

任何人都可以告訴我如何使用指定的類加載器加載枚舉單例(如果正確的ApplicationRegistry會在每個插件中得到解決),如果這可以工作,或者如果有另一個解決方案不涉及巨大在整個項目中重新設計?

感謝, 塞巴斯蒂安

回答

1

請不要加載使用多個類加載器相同的枚舉。你會去地獄(運行時錯誤地獄,就是這樣)。雖然枚舉單例/多重對於簡單任務來說非常棒,但它們並沒有像這樣的目的進行縮放。兩種可能的解決方案

a)使用每角度一個枚舉(即視角必須「知道」要尋找什麼枚舉的

B)讓枚舉項目「知道」自己屬於哪個角度(使用第二枚舉爲你的觀點):

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; 
    } 
} 
+0

那麼,這將導致這麼大的重新設計,我試圖避免,因爲我將不得不適應每一個電話。據我所知,我希望有一個簡單而乾淨的可能性,因爲網絡服務器完成了類似的事情。 – snieke