2012-09-23 74 views
2

我想限制沒有。類的直接實例(用Java語言)對n說,即在任何時候,不超過n個該類的直接對象存在於內存中。但是沒有這樣的限制。間接對象​​,比如這個類的任何子類。有沒有辦法在Java中實現這一點?限制編號。在Java中的類的實例

+5

很想知道這種需求的商業案例。 – Vikdor

+0

是的,非常好奇,擔心你爲什麼要這樣做。 Java不是爲此設計的。我可以想到的這兩種方法都可以讓你計算何時發佈實例,但都非常不鼓勵。 – Dunes

+0

我想知道是否可以通過啓動jvisualvm來創建一個特殊的插件來計算實例......這可能是一個愚蠢的想法,但技術可行嗎? –

回答

0

你可以這樣做:

static final AtomicInteger count = new AtomicInteger(); 

// in your parent constructor. 
if (getClass() == Parent.class && count.incrementAndGet() >= LIMIT) 
    throw new IllegalStateException(); 
+0

這不包含已發佈的實例 –

+0

我認爲這在主構造函數中,並且重寫主類中的finalize方法應該可行。謝謝。 –

3

使用工廠設計模式,如果您的實例超出您的限制,則拋出異常。下面

http://www.oodesign.com/factory-pattern.html

是一個粗略的樣本實現。

public class AnyClass { 
    private static final int limit_ = 8; 
    private static int count = 0; 

    private AnyClass() {} 

    public static synchronized AnyClass getInstance() { 
     if (count < limit_) { 
      AnyClass anyClass = new AnyClass(); 
      count++; 
      return anyClass; 
     } 
     return null; 
    } 
} 
+0

不要忘記將構造函數設置爲私有,以防止通過直接instansiation對工廠進行規避 – JTMon

+1

這不包含已發佈的實例 –

+0

覆蓋finalize來解釋已發佈的實例。 –

0

的Java本身不提供這種可能性。

我認爲你可以管理自己的情況與一個池工廠或直接在類的構造函數。 在構造函數中,如果INSTANCES> MAX_LIMIT,則檢查靜態計數器INSTANCES(定義爲類中的私有數字),然後引發異常。

+0

這不包含已發佈的實例 –

0

我認爲這樣做是一個壞主意(不知道你的使用情況),但反正...

你可以把一些代碼在類的構造函數計算所有實例。如果需要忽略子類的實例,請檢查getClass()返回的值。

要知道何時發佈實例,可以使用weak referencesWeakHashMap來估計仍在使用的實例數。實際使用的實例數量可能會更少,因爲垃圾回收會在不可預知的時間移除實例。對於確切的數字,當你知道一個實例將不再被使用時,你需要明確地調用一些方法。