Java 实现具有唯一标识号的类

Java 实现具有唯一标识号的类,java,Java,我必须创建一个具有int成员的类,它对于该类的每个对象都是唯一的。因此: public class Cls { private int id; public Cls(){id = unique number;} } 因此,当我对Cls对象进行x编号时,我必须确保没有任何类具有相同的id。但我希望避免在main中生成全局变量,并逐个设置id。如果可能的话,如果可以在构造函数中设置id,那就太好了。使用静态变量并递增它: public class Cls { privat

我必须创建一个具有int成员的类,它对于该类的每个对象都是唯一的。因此:

public class Cls {
    private int id;
    public Cls(){id = unique number;}
}

因此,当我对
Cls
对象进行x编号时,我必须确保没有任何类具有相同的id。但我希望避免在main中生成全局变量,并逐个设置id。如果可能的话,如果可以在构造函数中设置id,那就太好了。

使用静态变量并递增它:

public class Cls {

    private static int count = 0;
    private int id;

    public Cls() { 
        id = count;
        count++;
    }
}
第一个对象将具有
id=0
,第二个对象将具有
id=1
,以此类推

限制:此方法是最简单的方法,但如果您希望有一个使用多线程的应用程序,它将不起作用


多线程 如果您处于多线程环境中,则需要确保您有一些预期的结果。一些可能的方法:

1) 使用
java.util.concurrent.atomic
(例如
AtomicInteger
)中的类(根据OldCurmudgeon)

2) 调用具有以下结构的同步方法,而不是
count++

public static synchronized void incrementCount() {
    count++; 
}
3) 使用其他对象进行同步:

private static final Object lock = new Object();
然后使用它来同步增量操作:

public void increment() {
    synchronized(lock) {
        count++;
    }
}

您可以创建管理该索引唯一性的周围结构,也可以使用UUID。UUID仍然有很小的冲突机会,但对于少量数据来说,这应该不是问题。

您可以保存一个包含上次使用的值的
静态值,并在每次使用时始终递增该值。
AtomicInteger
非常适合这种情况,因为它是线程安全的,如果在多线程环境中使用,则不需要锁

public class Cls {
    // The last id I used.
    private static final AtomicInteger nextId = new AtomicInteger();
    // My id
    private final int id = nextId.getAndIncrement();

    public Cls() {
    }
}
你可以使用

该类提供了生成唯一ID的简单方法

import java.util.UUID;

public class GenerateUUID {

  public static final void main(String... aArgs){
    UUID uniqueID = UUID.randomUUID();
    log("unique ID: " + uniqueID);
  }

  private static void log(Object aObject){
    System.out.println( String.valueOf(aObject) );
  }
} 

它必须是数字uid吗?另外,您是在jvm中寻找unique,还是在应用程序的所有运行中寻找unique?您是只为活动对象还是在整个应用程序运行过程中寻找唯一对象


对于一组有限的答案(否,仅跨jvm,仅针对活动对象),最简单的方法是使用对象的对象id。但这不是数字,可以在对象死亡后重新使用。但是,您可以免费获得gaurenteed Unique。

您可以,但这样的代码在多线程环境中会失败。不能保证Cls的所有实例都有唯一的ID。我还添加了有关多线程上下文的详细信息。非常感谢。你如何定义“小”?参见数字我问你如何定义小。它确实引入了记忆障碍。
import java.util.UUID;

public class GenerateUUID {

  public static final void main(String... aArgs){
    UUID uniqueID = UUID.randomUUID();
    log("unique ID: " + uniqueID);
  }

  private static void log(Object aObject){
    System.out.println( String.valueOf(aObject) );
  }
}