2013-06-27 41 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