【问题标题】:How to assign a unique, ordered ID to a group of Java classes如何为一组 Java 类分配一个唯一的、有序的 ID
【发布时间】:2013-06-27 19:25:00
【问题描述】:

想象以下场景:

  • 我有一个基类,比如说 Fruit,还有许多子类,如 Apples、Oranges 等。
  • 我还有一个 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; 等,这将维持秩序,除非我搞砸了并且意外地让 Orange 和 Pear 都出现在 Apple 之后。本质上,我想将枚举的有序列表功能与类的继承和 OO 特性结合起来。有人可以告诉我是否有一种通常可以完成的方法。

我希望这个问题对 S.O. 来说不是太开放,但这是我在各种情况下都会遇到的问题,所以我希望有一个稍微标准化的解决方案。

【问题讨论】:

  • "让每一片 Fruit 都成为一个对象是没有意义的。" 和 Apple a = person.removeOne(Apple); 听起来你的要求是矛盾的。
  • 例如,这个人可能有 1000 个苹果,出于记忆的原因,它们不应该都是对象。当我删除一个时,我希望能够实例化一个新苹果,但直到我需要它。
  • 听起来像是 X-Y 问题。因为它是我不明白这里的用例是什么。这些水果有状态吗?听起来不像,因为您只想存储计数。如果是这样的话,取出一个水果变成一个物体有什么好处?
  • @thomas88wp:您可以使用enum轻松做到这一点。

标签: java


【解决方案1】:

听起来你真的需要一个Fruit 枚举,其值为APPLEORANGEPEAR。 Java 中的枚举是成熟的类;他们可以有字段和方法。这样,您可以使用 add() 和subtract() 方法将计数存储在每种水果类型中。每次调用person.add(Fruit f),在该方法中调用f.add(),每次调用person.remove(Fruit f),调用f.subtract()

这也让您可以完全回避排序问题——枚举根据它们的声明定义了一个非常简单的排序。

【讨论】:

  • 小心这个......枚举可以有字段,真的,但每个元素实际上是一个单例。因此,如果您调用 Fruit.APPLE.add()Fruit.APPLE.subtract(),您将更改苹果的 通用 计数,而不是 Person 的计数。
  • @sharakan:是的,Tom G 搞混了,但无论如何:enum Fruit 是解决 OP 问题的方法。为此 +1。
  • 是的,枚举是我的第一个,但问题是你失去了继承。我不能让 Apple 覆盖 Fruit 的方法。
  • @thomas88wp 是的,您可以...只需将抽象方法放在枚举级别,并为元素覆盖它们:例如,getColor、getSize...
  • @sharakan 啊,我明白了,你是对的。 Enums 不能扩展其他的,但 Apple 可以覆盖 Fruit 的方法。我不认为有任何方法可以将 Apple 移动到来自 Fruit 的单独文件中......随着更多 Fruit 的添加变得有点讨厌。我在想我可能同时拥有一个枚举和一个类,并相互引用。 Enum 保持顺序,Class 保持功能。
猜你喜欢
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2019-12-19
  • 2016-10-19
相关资源
最近更新 更多