2010-07-25 203 views
0

當我們只想創建一個類的對象時,我們使用單例設計模式。我想創建我的課程的最多3或5個對象。有什麼辦法來限制Java中最大的對象創建次數嗎?Java創建一個類的最多3個對象

+0

你想創建3(或5)個相同(即可互換)的對象,或者它們應具有不同的特徵(即,字段值)? – 2010-07-26 10:54:24

+0

清除http://stackoverflow.com/questions/3164379/only-5-instances-of-a-class的副本,請參閱我接受的解決方案的答案 – GHad 2010-09-17 08:55:11

回答

6

當然,你可以很容易地實現一個類似單例的特性,但是你顯然要找的是Object Pool

有這樣的水池的許多實現,一個顯着的一個apache commons/pool

1

正如seanizer提到你會實現的東西,已經做了,但是,如果你只是有這樣的一類,你是擔心,加入一個新的jar文件,並用它來進行這樣一個微不足道的操作對我來說似乎過度。

一個簡單的方法是有一個n(3-5)的數組,並且在「singleton」類中有一個私有構造函數。然後你將有一個instanceOf方法,這是獲取對象的唯一方法。

此方法將查看創建的對象的數量是否爲<n,如果是,則創建一個新對象並將其返回。

但是,如果所有對象都已經發出,您想要做什麼?

當您完成對象時,您需要確保將對象返回到池中,否則您將耗盡對象以分發。

當你發放一個對象時,你可以將它複製到一個集合或數組中,以知道它已經出來,或者,只要有一個布爾n的數組,當對象可用時爲true發放。

基本設計很簡單,其複雜性在於如何處理可能是錯誤條件的情況,在您的程序的其餘部分。

另外,您需要確保使用finally塊返回對象,以便在出現異常時仍然返回該對象。

0

在類中有一個靜態字段,用於計算實例已創建的次數。

class Foo { 
    private static Integer num_instances = 0, MAX = 3; 
    public Foo() throws Exception { 
    synchronized(Foo.num_instances) { 
     if(Foo.num_instances > MAX) throw new Exception(); 
     Foo.num_instances++; 
    } 
    } 
} 

編輯:它可能是壞的形式從構造函數拋出一個異常,那麼你可以做以下改爲:在任何如果您想池(最大NUM內存:

class Foo { 
    private static Integer num_instances = 0, MAX = 3; 
    public Foo try_to_get_a_new_foo() { 
    synchronized(Foo.num_instances) { 
     if(Foo.num_instances > MAX) return null; 
     Foo.num_instances++; 
     return new Foo(); 
    } 
    } 
} 

EDIT 2給定的時間),只需要實現的finalize():

class Foo { 
    private static Integer num_instances = 0, MAX = 3; 
    public Foo try_to_get_a_new_foo() { 
    synchronized(Foo.num_instances) { 
     if(Foo.num_instances > MAX) return null; 
     Foo.num_instances++; 
     return new Foo(); 
    } 
    } 
    public void finalize() { 
    synchronized(Foo.num_instances) { 
     Foo.num_instances--; 
    } 
    super.finalize(); 
    } 
} 
+0

此處的問題是,對象可能早已被垃圾收集而計數仍然存在。你需要在內存中保存這些對象來改變它,然後你又有了一個池。 – 2010-07-25 20:40:18

+0

因爲您正在更改您在同步代碼內進行同步的實例,所以在此處嘗試同步Foo.num_instances時是完全錯誤的。它不會做你認爲它的做法。 – Jorn 2010-07-25 20:42:28

+0

@seanizer OP說:「我想創建我的班級最多3或5個對象」,他沒有提及有多少內存實例。 @Jorn - Foo.num_instances是靜態的,所以我沒有改變我正在同步的實例。在說我「完全錯誤」之前,請提供一個代碼示例或一個清晰的解釋。 – twolfe18 2010-07-27 13:01:45

0

這裏是我的朋友Tripleton,他也許能幫助你,他的表妹昆頓是相當不言自明的:)。

編輯:

糟糕的代碼刪除,免得有人可能會真正地使用它,顯然是笑話是相當不明顯:)

+2

這是一個很糟糕的做法。 – someguy 2010-07-25 20:21:29

+0

所以你必須檢查所有3個案例才能找到一個開放的插槽,並希望你不會與其他線程進行相同的操作:) – bwawok 2010-07-25 20:37:52

+0

嗯,這是爲了開玩笑:) – darri 2010-07-25 21:00:01