想象以下場景:如何唯一的,有序的ID分配到一組Java類
- 我有一個基類,讓我們說水果,擁有一批像蘋果,橘子等子類
- 我也有一個人類與各種水果的庫存。在這種情況下,我只關心這個人有多少種水果。將每片水果作爲對象是沒有意義的。
- 我也應該能夠從人的庫存中刪除一塊水果,然後有一個實例化的對象。
- 水果應具有我可以分配的固有順序,以便它可以以類似方式從多個類中列出。蘋果總是走在橘子等之前
當我在人的庫存中談論水果時,我希望能夠以靜態方式引用它。如在int n = person.getPiecesofFruit(Apple);
。但是當我從一個人的庫存中刪除它時,我需要這個水果成爲一個對象,如Apple a = person.removeOne(Apple);
。
的明顯的方法來完成,這似乎是有水果的每個子類有一個靜態的ID字段,所以我可以只寫int n = person.getPiecesofFruit(Apple.ID);
這樣的人到只包含一個整數數組,其中每個水果的ID對應其計數所在的索引:
int[] fruitCounts = new int[Fruit.numberOfFruits()];
public int getPiecesOfFruit(int id) { return fruitCounts[id]; }
public int addFruit(int id, int count) { fruitCounts[id] += count; }
問題在於維護唯一的有序ID(理想情況下ID應該是連續的)。如果我刪除橙色課程,是否必須重新分配其他Fruit的ID?或者,如果我在Apple和Orange之間插入梨,我也有同樣的問題。我可以使用鏈表方式,並有Apple.ID = Orange.ID + 1;
等,這將保持秩序,除非我搞砸了,並且讓Orange和Pear都出現在Apple之後。基本上,我想將Enum的有序列表功能與類的繼承和OO特性結合起來。有人可以告訴我,這是否有辦法實現。
我希望這個問題對於S.O.來說不是太開放,但這是我在各種場景中遇到的一個問題,所以我希望有一個有點標準化的解決方案。
使用AtomicInteger http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html – noMAD
「_將每片水果作爲對象是沒有意義的._「和」蘋果a = person.removeOne(蘋果)「;聽起來像是你的要求中的矛盾。 – jlordo
就像在這個人一樣,這個人可能有1000個蘋果,因爲記憶原因,這不應該都是對象。當我刪除一個,我希望能夠實例化一個新的蘋果,但直到我需要它。 – thomas88wp