2013-06-27 42 views
0

想象以下場景:如何唯一的,有序的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.來說不是太開放,但這是我在各種場景中遇到的一個問題,所以我希望有一個有點標準化的解決方案。

+0

使用AtomicInteger http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html – noMAD

+0

「_將每片水果作爲對象是沒有意義的._「和」蘋果a = person.removeOne(蘋果)「;聽起來像是你的要求中的矛盾。 – jlordo

+0

就像在這個人一樣,這個人可能有1000個蘋果,因爲記憶原因,這不應該都是對象。當我刪除一個,我希望能夠實例化一個新的蘋果,但直到我需要它。 – thomas88wp

回答

5

這聽起來像你真的需要一個Fruit枚舉,其值爲APPLE,ORANGE,PEAR。 Java中的枚舉類是完整的類;他們可以有字段和方法。這樣,您可以使用add()和subtract()方法將計數存儲在每種水果類型中。每次您致電person.add(Fruit f)時,在該方法中您將調用f.add(),並且每次調用person.remove(Fruit f)時,都會調用f.subtract()

這也可以讓你完全擺脫順序問題 - 枚舉有一個非常簡單的定義,根據他們的聲明順序。

+0

小心這個......枚舉可以有字段,但是每個元素都是單獨的。因此,如果您調用Fruit.APPLE.add()或Fruit.APPLE.subtract(),您將更改該Apples的* universal *計數,而不是該'Person'的計數。 – sharakan

+0

@sharakan:是的,Tom G混淆了,但無論如何:'enum Fruit'是解決OP問題的方法。 +1。 – jlordo

+0

是的,Enum雖然是我的第一個,但問題是你失去了繼承。我不能讓Apple重寫Fruit的方法。 – thomas88wp