如何使用类似于时间戳的计数器

时间:2014-06-02 16:18:03

标签: java

我有一个Node对象,其中包含字段String值和int字段时间戳。 我希望timestamp字段是一个用作时间戳的整数,每次创建一个新节点时都会增加。

public class Node {
    String value;
    int timestamp;

    public Node(String v) {
        value = v;
    }
}

示例:

  • timestamp = 0
  • Node n1 = new Node("n1") - > timestamp = 1
  • Node n2 = new Node("n2") - > timestamp = 2
  • System.out.println(n1.timestamp); - > 1
  • System.out.println(n2.timestamp); - > 2

我该怎么做?

3 个答案:

答案 0 :(得分:2)

创建一个静态变量,然后在构造函数中递增它,并将timestamp设置为当前值:

public class Node {
    String value;
    static counter; 
    int timestamp;

    public Node(String v) {
        value = v;
        counter++;
        timestamp = counter;
    }
}

答案 1 :(得分:2)

虽然@AdamYost可能是正确的,但是有一个问题。

您需要timestamp作为静态变量,但在创建对象时需要另一个变量来保存字段timestamp的值。

所以它将是

public class Node {
  String value;
  static int timestampCounter;
  int timestamp;

  public Node(String value) {
    this.value = value;
    timestamp = ++timestampCounter;
  }
}

使用Adam解决方案,您最终会得到所有具有最新时间戳值的对象,根据您的输出示例,它不是您需要的。

答案 2 :(得分:1)

要考虑多线程,您需要以线程安全的方式生成时间戳(实际生成计数器或唯一ID将是更好的术语)。

虽然这可以使用同步静态方法完成,但就性能而言,AtomicInteger可能是最好的:

public class Node {
     private final static AtomicInteger ID_GENERATOR = new AtomicInteger();

     String value;
     int id;

     public Node(String value) {
          this.id = ID_GENERATOR.incrementAndGet();
          this.value = value;
     }
}

使用原子生成器确保id是唯一的(生成器溢出除外),即使多个线程生成Node对象也是如此。