如何为一组Java类分配唯一的有序ID

时间:2013-06-27 19:25:00

标签: java

想象一下以下场景:

  • 我有一个基类,比方说Fruit,有许多子类,如苹果,橘子等。
  • 我还有一个Person类,里面有各种各样的水果。在这种情况下,我只关心这个人有多少种水果。让每块水果都成为一个物体是没有意义的。
  • 我还应该能够从人的库存中删除一块水果,然后拥有一个实例化的对象。
  • Fruit应该具有我可以分配的内在顺序,以便可以从多个类中以类似的方式列出它。苹果总是先去橘子等。

当我在谈论人员库存中的水果时,我希望能够以静态的方式引用它。与int n = person.getPiecesofFruit(Apple);中一样。但是当我从一个人的库存中删除它时,我需要将水果作为一个对象,就像在Apple a = person.removeOne(Apple);中一样。

实现这一点的明显方法似乎是让Fruit的每个子类都有一个静态ID字段,所以我可以写int n = person.getPiecesofFruit(Apple.ID);

这允许Person只包含一个整数数组,其中每个Fruit的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应该是连续的)。如果我删除了Orange课程,我是否必须重新分配所有其他Fruit的ID?或者,如果我在Apple和Orange之间插入Pear,我也有同样的问题。我可以使用链接列表方法并拥有Apple.ID = Orange.ID + 1;等,这将保持秩序,除非我搞砸了,并使橘子和梨都偶然来到苹果之后。本质上,我想将Enum的有序列表功能与Class的继承和OO特性结合起来。有人可以告诉我,这是否通常可以实现。

我希望这个问题对S.O.来说不是太开放,但这是我在各种场景中遇到的问题,所以我希望有一个有点标准化的解决方案。

1 个答案:

答案 0 :(得分:5)

听起来我真的需要一个Fruit枚举,其值为APPLEORANGEPEAR。 Java中的枚举是完整的类;他们可以有领域和方法。这样,您可以使用add()和subtract()方法将计数存储在每种水果类型中。每次拨打person.add(Fruit f)时,您都会在该方法中调用f.add(),每次拨打person.remove(Fruit f)时,都会调用f.subtract()

这也让你完全回避订购问题 - 枚举根据他们的声明有一个非常简单的定义。