我有一个Node对象,其中包含字段String值和int字段时间戳。 我希望timestamp字段是一个用作时间戳的整数,每次创建一个新节点时都会增加。
public class Node {
String value;
int timestamp;
public Node(String v) {
value = v;
}
}
示例:
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 我该怎么做?
答案 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对象也是如此。