我在 Thinking in Java 中读到了这段代码,感到很困惑:
package generics;
//: generics/Mixins.java
import java.util.*;
interface TimeStamped { long getStamp(); }
class TimeStampedImp implements TimeStamped {
private final long timeStamp;
public TimeStampedImp() {
timeStamp = new Date().getTime();
}
public long getStamp() { return timeStamp; }
}
interface SerialNumbered { long getSerialNumber(); }
class SerialNumberedImp implements SerialNumbered {
private static long counter = 1;
private final long serialNumber = counter++;
public long getSerialNumber() { return serialNumber; }
}
interface Basic {
public void set(String val);
public String get();
}
class BasicImp implements Basic {
private String value;
public void set(String val) { value = val; }
public String get() { return value; }
}
class Mixin extends BasicImp
implements TimeStamped, SerialNumbered {
private TimeStamped timeStamp = new TimeStampedImp();
private SerialNumbered serialNumber =
new SerialNumberedImp();
public long getStamp() { return timeStamp.getStamp(); }
public long getSerialNumber() {
return serialNumber.getSerialNumber();
}
}
public class Mixins {
public static void main(String[] args) {
Mixin mixin1 = new Mixin(), mixin2 = new Mixin();
mixin1.set("test string 1");
mixin2.set("test string 2");
System.out.println(mixin1.get() + " " +
mixin1.getStamp() + " " + mixin1.getSerialNumber());
System.out.println(mixin2.get() + " " +
mixin2.getStamp() + " " + mixin2.getSerialNumber());
while(true)System.out.println(new Date().getTime());
}
} /* Output: (Sample)
test string 1 1132437151359 1
test string 2 1132437151359 2
*///:~
为什么 getStamp() 返回的值相同? (1132437151359==1132437151359)? 创建了两个对象,并且它们在不同时间创建了不同的属性,所以为什么?
最佳答案
表达式new Date().getTime()
是一种执行System.currentTimeMillis()
的缓慢方法,其最小分辨率为一毫秒(但是在某些操作系统上可能长达 16 毫秒)
这意味着如果调用该方法的时间间隔小于一毫秒,则可以给出相同的结果。
更好的选择是使用 AtomicLong.getAndIncrement() 作为 ids。
关于java - 为什么 getStamp() 返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283306/