我必须创建一个具有int成员的类,该成员对于该类的每个对象都是唯一的。所以:
public class Cls {
private int id;
public Cls(){id = unique number;}
}
因此,当我创建x个Cls
个对象时,我必须确保没有类具有相同的id。但我想避免在main中创建全局变量,并逐个设置id。如果可能的话,可以在构造函数中设置id。
答案 0 :(得分:5)
您可以保存包含您使用的最后一个值的static
值,并且每次使用时都会增加该值。 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() {
}
}
答案 1 :(得分:4)
UUID类提供了一种生成唯一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) );
}
}
答案 2 :(得分:2)
使用静态变量并递增它:
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++;
}
}
答案 3 :(得分:0)
您可以创建一个管理该索引唯一性的周围结构,也可以使用UUID。 UUID仍有轻微的碰撞机会,但这对于少量数据来说不应该是一个问题。
答案 4 :(得分:0)
您可以使用UUID
String uniqueID = UUID.randomUUID().toString();
答案 5 :(得分:0)
它必须是数字uid吗?此外,您是否正在寻找独特的整个jvm或在应用程序的所有运行中独一无二?您是否只在活动对象或整个应用程序运行中寻找独特的东西?
对于一组有限的答案(不,仅限于jvm,仅针对实时对象),最简单的方法是使用对象的Object id。但这不是数字,可以在对象死后重复使用。然而,你可以免费获得gaurenteed的独特性。