2017-04-19 60 views
0

Singleton根據ClassLoader創建實例。與Singleton,ClassLoader不同,如果該類不是Singleton,則會在遇到該類的對象創建時創建另一個對象。每個會話多個對象vs單獨對象

我的問題是:可以在那裏'n'每個會話的類的對象數?

+0

什麼是'session'? –

+0

ClassLoaders不處理對象實例化,甚至不能進行類初始化。他們所做的只是*加載*類並提供對資源的訪問。 「單身」也不是Java所固有的類別特徵;相反,它是一些類的實現的表徵。 –

+0

你真的想知道什麼?是否可以有多個非單例類的實例?答案應該很明顯,對嗎? –

回答

1

有需要發生之前,你可以在「使用」一類的實例三樣東西,其中每一個需要堆內存的分配:

字節碼需要加載和鏈接的類來解決任何靜態依賴於其他類。 該類需要初始化。 需要創建類的實例。 類的加載和鏈接通常在啓動JVM時發生,儘管它可以由JVM「懶惰地」完成,並且可以動態完成;例如使用Class.forName(...)。這是分配類「代碼」的內存的時候。

類初始化通常在第一次實際使用該類之前立即完成。 (具體細節在JLS中列出)。這是分配類靜態內存的時候。

使用新構造時會發生類創建。這也會觸發尚未初始化的類的類初始化。這是當一個實例的內存分配時

0

是的,你可以在會話範圍內有2個非單例類的對象。

0

如果你想確保你的會話將有n個你的類的實例,而不是更多的實現這種行爲是由你來決定的。和Singleton一樣。 Java不提供確保Singleton模式實現的機制。它可以是程序員,也可以是一些可以做到的框架。所以,如果你想要一個預先定義好的班級實例,這是你的責任。這裏是最簡單的想法:

 public class MyTest { 
      private static List<MyTest> instances = new ArrayList<>(5); 
      static { 
       for(int i = 0; i < 5; i++) { 
        instances.add(new MyTest()); 
       } 
      } 

      public static MyTest getInstance() { 
       return instances.get(3 /*or whatever logic to determine which one/*); 
      } 

     ... 
     }