想象以下场景:如何唯一的,有序的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