如何確保每個類的實例都具有特定參數的唯一值? 例如: public Foo(int value);對於Foo的每個實例, 的值應該不同。否則,它可能會拋出異常。如何在Java中創建唯一的特定參數
回答
你想分配這個值,還是隻是想確認你有某種ID?
爲ID的最小的解決辦法是使用靜態字段作爲計數器:
public class Foo {
private static int counter = 1;
private int id;
public Foo() {
id = counter++;
}
}
要檢查分配值,您可能想使用某種FooFactory的:
public class FooFactory {
private static Set<int> ids = new Set<int>();
public static Foo createFoo(int value) {
if (ids.contains(value)) {
throw new FooAlreadyExistsException();
}
ids.add(value);
return new Foo(value);
}
}
或者,正如其他意見所示,您可以在Foo構造函數中執行此操作:
public class Foo {
private static Set<int> ids = new Set<int>();
public Foo(int value) {
if (ids.contains(value)) {
throw new FooAlreadyExistsException();
}
ids.add(value);
}
}
假設Foo的所有實例都在內存中,您可以在Foo類中維護一個靜態Set,它將保存已使用的值。您可以在任何時候創建新實例時檢查此Set。假設對這個值沒有功能意義,另一種方法是創建一些序列(由數據庫或文件支持),每次創建新實例時都會增加一個序列,並且每個新實例的值將是該序列的當前值。
您或者需要'Set
@AaronDigulla我建議一個Set。我不認爲地圖是必要的。 – Eran 2015-02-11 11:24:45
但是,如果重複出現,那麼該怎麼辦?它是創建對象嗎?如果我不想創建對象然後。 – 2015-02-11 11:25:11
我建議在一個類內部有一個靜態的ArrayList,它包含了你的對象列表。但這是不好的設計恕我直言。
我認爲你的獨特的價值不應該是一個參數(這是一個任意調用者的控制下),而是Foo的責任。
簡單的解決辦法是使用它的每個實例被創建時增加一個靜態字段:
private static int instanceCounter;
// instance initializer
{
instanceCounter++;
}
正如其他人提到這個氣味的問題在你的設計或您的要求的理解。
請分享您迄今爲止創建的需求,您的預期設計和代碼。
編輯:'亞倫Digulla'有一個更好的建議,創建一個工廠,管理對象生命週期的這方面。
創建一個工廠:
public Foo createFoo(int value) {....}
在工廠代碼,你可以保持一組的「分配」值。這使您可以優化代碼;例如,如果值是連續的,則BitSet
可能比Set<Integer>
更好。請注意,如果您希望能夠重用值,則必須以某種方式「釋放」您的Foo
實例。
如果您只是Foo
的GC實例,則該值仍將「正在使用」,除非您以某種方式通知工廠。
到目前爲止,這是IMO的最佳建議。 – 2015-02-11 11:27:20
爲最佳答案+1投票! – 2015-02-11 11:34:59
- 1. 在MongoDB中創建唯一的數組
- 2. 如何將唯一指針傳遞給函數中所需的特定參數?
- 3. 如何在Python數據框中創建唯一的記錄ID
- 4. 如何在分片數據庫中創建唯一的行ID?
- 5. 如何在oracle數據庫中創建唯一的關鍵字?
- 6. 如何保證的註解參數在Java類唯一
- 7. 在Java中的ArrayList中創建唯一項目的ArrayList
- 8. 如何在數據幀中創建唯一行
- 9. 如何創建唯一的參考號碼 - wordpress
- 10. 如何使用在Java中創建實例的參數創建方法?
- 11. 如何在MySQL表中創建一個唯一的列?
- 12. 在SQLAlchemy中,我該如何創建一個唯一的對?
- 13. Java如何創建唯一的對象名稱?
- 14. 如何在dom中創建一些特定值的字符串?
- 15. 如何創建一個沒有參數的布爾方法 - Java
- 16. 在ASP.NET中創建唯一的URL
- 17. 在Java中創建唯一的時間戳
- 18. 在java中創建4字節唯一標識的策略
- 19. 如何在Java中的三個變量上創建唯一索引?
- 20. 如何在java中創建一個gui?
- 21. 如何在NA中創建新的(唯一的)CustomerID?
- 22. 如何確定參數是否已從Java「發佈」或「創建」?
- 23. 從深度數組中的任意位置存在的特定鍵值中創建一個唯一值列表
- 24. 如何在swift中生成特定於設備的唯一uuid
- 25. 創建自定義函數來計算列中的唯一值
- 26. 如何在zeromq中創建一個「唯一」套接字?
- 27. INDEX創建的唯一參數 - 用於什麼?
- 28. 如何在java中創建3D數組?
- 29. 如何在Java中創建JSON數組
- 30. 如何在Python中創建唯一的映射鍵?
您可以發佈您的代碼嗎?你到目前爲止做了什麼? – 2015-02-11 11:20:27
您可以將值存儲在Set中,並檢查它是否不在。但是你的問題聞起來像一個設計缺陷,海事組織。 – 2015-02-11 11:20:58