Какой смысл Clock.withZone? - PullRequest
1 голос
/ 24 июня 2019

java.time.Clock обеспечивает доступ к millis и instant, но не имеет доступа ни к чему, что зависит от часовых поясов.Тем не менее, он содержит часовой пояс и требует его для строительства.Похоже, он используется только для 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 Ответ

4 голосов
/ 24 июня 2019

Документы описывают все назначение часов как в основном пары (миллисегенератор, часовой пояс), особенно для тестирования:

Экземпляры этого класса используются для поиска текущего момента, который можно интерпретировать с использованием сохраненного часового пояса для поиска текущей даты и времени. Таким образом, часы могут использоваться вместо System.currentTimeMillis () и TimeZone.getDefault ().

Использование часов не является обязательным. Все ключевые классы даты и времени также имеют фабричный метод now (), который использует системные часы в часовом поясе по умолчанию. Основная цель этой абстракции - позволить подключать альтернативные часы по мере необходимости. Приложения используют объект для получения текущего времени, а не статический метод. Это может упростить тестирование.

(выделение добавлено)

Например, если вы хотите проверить, как ваш класс действует в определенный момент в определенном часовом поясе, вы можете добавить экземпляр Clock.fixed. В рабочем коде вы бы использовали одну из Clock.system* фабрик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...