java - 生成唯一的自动递增实例 ID

标签 java uniqueidentifier identifier

我一直在尝试为从 1 开始的类实例生成唯一 ID,如下所示:

public abstract class foo {
    static int ID = 0;
    final int id;

    public foo() { this.id = ++ID; }
}

然后我意识到我有几个类需要这种行为,因此我尝试创建一个抽象类来继承,但我发现 static 字段不能真正被继承。

有什么方法可以在 Java 中重用这种常见行为吗?

编辑:
我没有说清楚,但是我需要每个子类的索引不仅是唯一的,而且是连续的。

例如,如果我有 barbaz 继承自 foo:

bar b1 = new bar();
baz b2 = new baz();
bar b3 = new bar();

b2 应具有 id == 1b3 应具有 id == 2

最佳答案

不是真的!您可以尝试以下几种方法:

  1. 有一个IDGenerator类具有静态方法来为特定类生成新 ID。 .generate()方法需要 Class<?>参数,并会维护 HashMap将类映射到最近给出的标识符。这会将所有逻辑放入一个类中,但并不会真正简化事情。
  2. 拥有对 IDGenerator 的新实例的静态引用每个想要使用这种行为的类中的类。在这种情况下,IDGenerator类不需要 Class<?>参数,因为每个使用它的类都会有一个实例。它的.generate()方法将是无参数方法。再说一次,我不确定这会让事情变得更简单。
  3. 放弃连续 ID 的要求。这样,你就可以上课了IDGenerator带有静态无参数 .generate()方法只会给出下一个未使用的标识符。这样,您的标识符在您的应用程序中将是唯一的,并且在类中不是连续的。

您所拥有的非常简单且纤薄。

还有一个小注意事项:您说您希望 ID 从 0 开始,但按照您的编写方式,它们将从 1 开始。您想要 this.id = ID++而不是this.id = ++ID .

关于java - 生成唯一的自动递增实例 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745402/

相关文章:

swift - 使用未解析的标识符 'result' swift 3

ios - identifierForVendor 是否随应用程序更新而改变?

java - 比较一个 ArrayList 并组合共同的元素

java - 如何实现打印下一个较小元素的索引的方法(在java中)?

android - 主机卡仿真 - 是否可以将字符串从一部手机传输到另一部手机?

java获取唯一的服务器ID以供引用

java - 使用 ID 在客户端-服务器之间发送消息 - Java

java - Flutter 不是只创建 Java 类,而是 Kotlin

java - JPA 元模型生成器不会创建所有字段

sql-server-2005 - 将计数 > 1 的表连接到自身