实现具有唯一标识号的类

时间:2014-09-15 16:03:53

标签: java

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

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

因此,当我创建x个Cls个对象时,我必须确保没有类具有相同的id。但我想避免在main中创建全局变量,并逐个设置id。如果可能的话,可以在构造函数中设置id。

6 个答案:

答案 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) );
  }
} 

read more

答案 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的独特性。