簡體   English   中英

如何使現有的Java類/接口實現單例?

[英]How can I make an existing Java class/interface implementation a singleton?

假設我在Spring中使用ApplicationContext實現。

ApplicationContext是Java Spring Framework中的接口,我無法更改它。

如何確保該實現只能有一個實例?

例如。 我有以下代碼-

public class ApplicationContextSingleton 
{
     private static ApplicationContext context;
     private static int numberOfInstances = 0;

     public static ApplicationContext getApplicationContext()
     {
         if(numberOfInstances == 0)
         {
             context = new ClassPathXmlApplicationContext("spring.xml");
             numberOfInstances++;
         }
         return context;
     }
}

這樣,我可以確保只有一個ApplicationContext實例,條件是按以下方式獲得它:

ApplicationContext context = ApplicationContextSingleton.getApplicationContext();

但這並不能阻止其他程序員說-

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

從而創建一個新的ApplicationContext。 如何防止這種情況發生?

您希望將ApplicationContext設為單例,因此我用自己的自定義類覆蓋了該類,確保它首先出現在類路徑上,並使其具有私有構造函數。

也就是說,如果您不願意將其設置為單例。 正如其他答案和評論所指出的那樣,還有更好的方法可以解決您的問題。

應該注意的是,覆蓋庫片段通常不是一個好主意,因為這可能會在以后引起麻煩,尤其是當您嘗試升級框架版本時。

除非有人能提出一些新穎的創意,否則我認為沒有辦法。 這類似於嘗試將int單例化。 只是不會發生,因為您無法控制未編寫的類的使用。 您將只需要信任您的開發人員就不會創建第二個上下文。

另外,我幾乎可以保證這是不可能的 ,但是您可以獲取spring的完整源代碼,進行一些代碼更改以使上下文成為單例,然后自行構建。 不太可能的解決方案,但是我覺得還是需要指出來。

之所以無法這樣做,是因為

Spring並未將ClassPathXmlApplicationContext實現為Singleton模式。 通知每個人您都有一種實用方法來訪問上下文對象,並且使用new創建上下文非常昂貴。

  1. 使用自動構建系統,該系統在將代碼提交到您的軟件存儲庫時就可以生成您的代碼。
  2. 將工具(例如FindBugs或PMD)集成到您的構建過程中。 如果這些工具觸發了某些條件,則使構建失敗並不允許生成任何工件。
  3. 在集成工具中創建一個案例,以尋找開發人員創建自己的上下文。

因此,您不能阻止他們這樣做,但是可以阻止他們將這些事情推送到您的開發,質量保證和產品環境中。 這似乎有些過分,但是這種過程將幫助開發人員完成數百項但不應該做的事情。

Josh Block建議在有效Java中使用枚舉。 這不是到該書的鏈接 ,但它顯示了他和較舊的(替代)方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM