我一直在尝试为从 1 开始的类实例生成唯一 ID,如下所示:
public abstract class foo {
static int ID = 0;
final int id;
public foo() { this.id = ++ID; }
}
然后我意识到我有几个类需要这种行为,因此我尝试创建一个抽象类来继承,但我发现 static
字段不能真正被继承。
有什么方法可以在 Java 中重用这种常见行为吗?
编辑:
我没有说清楚,但是我需要每个子类的索引不仅是唯一的,而且是连续的。
例如,如果我有 bar
和 baz
继承自 foo
:
bar b1 = new bar();
baz b2 = new baz();
bar b3 = new bar();
b2
应具有 id == 1
,b3
应具有 id == 2
。
最佳答案
不是真的!您可以尝试以下几种方法:
- 有一个
IDGenerator
类具有静态方法来为特定类生成新 ID。.generate()
方法需要Class<?>
参数,并会维护HashMap
将类映射到最近给出的标识符。这会将所有逻辑放入一个类中,但并不会真正简化事情。 - 拥有对
IDGenerator
的新实例的静态引用每个想要使用这种行为的类中的类。在这种情况下,IDGenerator
类不需要Class<?>
参数,因为每个使用它的类都会有一个实例。它的.generate()
方法将是无参数方法。再说一次,我不确定这会让事情变得更简单。 - 放弃连续 ID 的要求。这样,你就可以上课了
IDGenerator
带有静态无参数.generate()
方法只会给出下一个未使用的标识符。这样,您的标识符在您的应用程序中将是唯一的,并且在类中不是连续的。
您所拥有的非常简单且纤薄。
还有一个小注意事项:您说您希望 ID 从 0 开始,但按照您的编写方式,它们将从 1 开始。您想要 this.id = ID++
而不是this.id = ++ID
.
关于java - 生成唯一的自动递增实例 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745402/