當我們只想創建一個類的對象時,我們使用單例設計模式。我想創建我的課程的最多3或5個對象。有什麼辦法來限制Java中最大的對象創建次數嗎?Java創建一個類的最多3個對象
回答
當然,你可以很容易地實現一個類似單例的特性,但是你顯然要找的是Object Pool。
有這樣的水池的許多實現,一個顯着的一個apache commons/pool
正如seanizer提到你會實現的東西,已經做了,但是,如果你只是有這樣的一類,你是擔心,加入一個新的jar文件,並用它來進行這樣一個微不足道的操作對我來說似乎過度。
一個簡單的方法是有一個n(3-5)的數組,並且在「singleton」類中有一個私有構造函數。然後你將有一個instanceOf
方法,這是獲取對象的唯一方法。
此方法將查看創建的對象的數量是否爲<n,如果是,則創建一個新對象並將其返回。
但是,如果所有對象都已經發出,您想要做什麼?
當您完成對象時,您需要確保將對象返回到池中,否則您將耗盡對象以分發。
當你發放一個對象時,你可以將它複製到一個集合或數組中,以知道它已經出來,或者,只要有一個布爾n的數組,當對象可用時爲true發放。
基本設計很簡單,其複雜性在於如何處理可能是錯誤條件的情況,在您的程序的其餘部分。
另外,您需要確保使用finally
塊返回對象,以便在出現異常時仍然返回該對象。
在類中有一個靜態字段,用於計算實例已創建的次數。
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();
}
}
此處的問題是,對象可能早已被垃圾收集而計數仍然存在。你需要在內存中保存這些對象來改變它,然後你又有了一個池。 – 2010-07-25 20:40:18
因爲您正在更改您在同步代碼內進行同步的實例,所以在此處嘗試同步Foo.num_instances時是完全錯誤的。它不會做你認爲它的做法。 – Jorn 2010-07-25 20:42:28
@seanizer OP說:「我想創建我的班級最多3或5個對象」,他沒有提及有多少內存實例。 @Jorn - Foo.num_instances是靜態的,所以我沒有改變我正在同步的實例。在說我「完全錯誤」之前,請提供一個代碼示例或一個清晰的解釋。 – twolfe18 2010-07-27 13:01:45
可能是你正在尋找Multiton Pattern
- 1. Java創建一個包含多個對象的類的列表
- 2. Python3,一次創建一個類的多個對象
- 3. Swift 3創建一個NSNumber對象
- 4. 創建一個Java類的新對象返回一個空對象
- 5. 跨多個文件創建對象(Java)
- 6. 創建了多少個對象 - Java
- 7. 在java中創建多個對象oop
- 8. 從GUI創建一個對象 - Java的
- 9. 在C#創建一個類型的多個對象
- 10. Java:創建一個類型爲類型參數的對象
- 11. 創建多個子類對象
- 12. 在類中創建多個對象
- 13. 創建另一個類的Python對象
- 14. 關於創建一個類的對象
- 15. 從另一個對象類型創建一個對象
- 16. 在一個對象中創建一個對象類
- 17. 用單一形式創建多個對象(類似的類型)
- 18. 創建一個具有另一個類的對象的類
- 19. 在java中創建一個對象
- 20. 創建一個Circle對象錯誤.Java
- 21. 在Java中創建一個XML對象
- 22. 從多個變量類型創建一個對象
- 23. Python使用多個文件從一個類創建對象
- 24. 如何用ruby中的對象(類)創建一個對象(類)?
- 25. 從python的另一個類創建一個類對象
- 26. 創建多個對象
- 27. 多少個對象創建
- 28. Three.js創建多個對象
- 29. 多個simple_html_dom()對象創建
- 30. 創建多個對象
你想創建3(或5)個相同(即可互換)的對象,或者它們應具有不同的特徵(即,字段值)? – 2010-07-26 10:54:24
清除http://stackoverflow.com/questions/3164379/only-5-instances-of-a-class的副本,請參閱我接受的解決方案的答案 – GHad 2010-09-17 08:55:11