【问题标题】:Integer increment and concat with string整数增量并与字符串连接
【发布时间】:2011-07-08 23:22:54
【问题描述】:

我正在创建一种方法来生成唯一的 id,类型为 Integer,并且想知道如何执行以下操作。

在我的对象中,我想从我的 setter 方法调用 generateUniqueID 方法。 generateUniqueID 将生成一个递增的数字,然后将其附加到一个字符串中

例如Reminder-1、Reminder-2 等......

我不太确定如何执行此操作,想知道是否有人可以提供帮助?

谢谢

【问题讨论】:

  • 好吧,你保留一个计数器并递增它......你觉得哪一点很棘手?
  • 为什么不System.currentTimeMillis()?虽然它会是long
  • 您想要为您创建的每个对象设置一个唯一标识符?
  • @adarshr: 并且多次调用可以返回相同的结果...
  • @Mark Peters - 是的,只要它们几乎同时发生。这就是为什么我需要知道并发量是多少:)

标签: java auto-increment


【解决方案1】:

只要没有并发。

private static int reminderID = 1;

public synchronized static String generateUniqueID() {
    String uniqueId = "Reminder-" + reminderID;
    reminderID++;
    return uniqueId;
}

【讨论】:

  • 假设您没有在集群环境中运行,否则您可能仍然会得到相同的 ID。
  • @Mark Peters:“只要没有并发”
  • 这是根据 OP 的已知规范工作的最简单的解决方案。
  • @Eric 之后添加的。该死的宽限期。
  • 最好将该方法的主体放在该类的 Class 对象上的同步块中。否则,两个几乎同时的调用可能会在执行中重叠并提供错误的结果。编辑:哎呀,打字时弹出了一些cmets。我的意思是说它可以是一个同步的静态方法。
【解决方案2】:
private static final AtomicInteger counter = new AtomicInteger(1);

public String generateUniqueID() {
    return "Reminder-" + counter.getAndIncrement();
}

【讨论】:

  • 应该声明为静态的,否则 ID 将依赖于实例。
  • 我正在为自己制定一个新的口头禅:“先看看 java.util.concurrent”!
【解决方案3】:

如果你有很多这些,你可以使用 base 36 编码。

private final AtomicLong counter = new AtomicLong();

public String generateUniqueID() {
    return "Reminder-" + Long.toString(counter.incrementAndGet(), 36);
}

【讨论】:

    【解决方案4】:

    也许:

    class Classname {
        private static int highestId = 0;
        int object_id;
    
        public Classname() {
            object_id = highestId++;
        }
    }
    

    行得通吗?

    如上所述,这不是线程安全的。

    【讨论】:

    • 除了object 危险地接近成为保留名称
    • 是的,这只是一个简单的例子。这里的第一个答案更好。为了确定,我将编辑名称。
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2018-01-02
    • 2013-10-20
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多