Clock.withZone有什么意义?

时间:2019-06-24 03:35:27

标签: java

java.time.Clock提供对millisinstant的访问权限,但不能访问任何依赖时区的内容。但是它包含一个时区,并且需要一个时区才能进行构建。它似乎仅用于equals / hashcode。

static final class SystemClock extends Clock implements Serializable {
    private static final long serialVersionUID = 6740630888130243051L;
    private final ZoneId zone;

    SystemClock(ZoneId zone) {
        this.zone = zone;
    }
    @Override
    public ZoneId getZone() {
        return zone;
    }
    @Override
    public Clock withZone(ZoneId zone) {
        if (zone.equals(this.zone)) {  // intentional NPE
            return this;
        }
        return new SystemClock(zone);
    }
    @Override
    public long millis() {
        return System.currentTimeMillis();
    }
    @Override
    public Instant instant() {
        return Instant.ofEpochMilli(millis());
    }
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof SystemClock) {
            return zone.equals(((SystemClock) obj).zone);
        }
        return false;
    }
    @Override
    public int hashCode() {
        return zone.hashCode() + 1;
    }
    @Override
    public String toString() {
        return "SystemClock[" + zone + "]";
    }
}

是否有必要在此类中加入ZoneId

1 个答案:

答案 0 :(得分:4)

docs将Clock的整个目的描述为基本上是一个(毫秒发生器,时区)对,尤其是用于测试:

  

此类的实例用于查找当前时刻,可以使用存储的时区来解释当前时刻以查找当前日期和时间。因此,可以使用时钟代替System.currentTimeMillis()和TimeZone.getDefault()。

     

使用时钟是可选的。所有关键日期时间类还具有now()工厂方法,该方法在默认时区使用系统时钟。 此抽象的主要目的是允许在需要时插入备用时钟。应用程序使用对象而不是静态方法来获取当前时间。 这可以简化测试。

(添加了重点)

例如,如果要测试类在特定时区的特定瞬间的行为,可以插入Clock.fixed实例。在生产代码中,您将使用Clock.system*工厂之一。