Интерфейс InstantSource
- Все известные реализующие классы:
Clock
public interface InstantSource
Экземпляры этого интерфейса используются для доступа к подключаемому представлению текущего момента времени. Например, InstantSource можно использовать вместо System.currentTimeMillis().
Основная цель этой абстракции — позволить подключать альтернативные источники мгновений времени по мере необходимости. Приложения используют объект для получения текущего времени вместо статического метода. Это может упростить тестирование.
Таким образом, этот интерфейс не гарантирует, что результат фактически представляет текущий момент на временной шкале. Вместо этого он позволяет приложению предоставить контролируемый вид текущего момента времени.
Лучшая практика для приложений — передавать InstantSource в любой метод, который требует текущего момента времени. Фреймворк для инъекции зависимостей — один из способов достижения этого:
public class MyBean {
private InstantSource source; // dependency inject
...
public void process(Instant endInstant) {
if (source.instant().isAfter(endInstant) {
...
}
}
}
Этот подход позволяет использовать альтернативный источник, такой как fixed или offset во время тестирования. Фабричный метод system предоставляет источник, основанный на лучшем доступном системном часе. Это может использовать System.currentTimeMillis(), или более точный час, если он доступен.
- Требования к реализации:
- Этот интерфейс должен быть реализован с осторожностью, чтобы обеспечить правильную работу других классов. Все реализации должны быть потокобезопасными — один экземпляр должен быть способен вызываться из нескольких потоков без негативных последствий, таких как гонки.
Основные методы определены для возможности выброса исключения. В обычном использовании исключения не будут выброшены, однако одной возможной реализацией было бы получение времени с центрального сервера времени через сеть. Очевидно, что в этом случае поиск может завершиться неудачей, и поэтому метод может выбросить исключение.
Возвращаемые мгновения времени из
InstantSourceработают на временной шкале, игнорирующей високосные секунды, как описано вInstant. Если реализация оборачивает источник, который предоставляет информацию о високосных секундах, то должен быть использован механизм для «сглаживания» високосной секунды. Временная шкала Java требует использования UTC-SLS, однако реализации могут выбирать, насколько точными они будут с временной шкалой, при условии, что они документируют, как они работают. Поэтому реализации не обязаны фактически выполнять сдвиг UTC-SLS или каким-либо иным образом быть осведомлёнными о високосных секундах.Реализации должны реализовывать
Serializableпо возможности и должны документировать, поддерживают ли они сериализацию. - Примечание к реализации:
- Представленная здесь реализация основана на том же базовом системном часе, что и
System.currentTimeMillis(), но может иметь точность, более тонкую, чем миллисекунды, если доступна. Однако о точности базового системного часа не гарантируется ничего. Приложениям, требующим более точного системного часов, необходимо реализовать этот абстрактный класс самостоятельно, используя другой внешний системный час, такой как сервер NTP. - С:
- 17
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static InstantSource |
fixed |
Получает источник, который всегда возвращает одно и то же мгновение времени. |
Instant |
instant() |
Получает текущее мгновение времени источника. |
default long |
millis() |
Получает текущее мгновение времени источника в миллисекундах. |
static InstantSource |
offset |
Получает источник, который возвращает мгновения времени из указанного источника с добавленной продолжительностью. |
static InstantSource |
system() |
Получает источник, возвращающий текущее мгновение времени, используя лучшие доступные системные часы. |
static InstantSource |
tick |
Получает источник, который возвращает мгновения времени из указанного источника, усечённые до ближайшего значения указанной продолжительности. |
default Clock |
withZone |
Возвращает часы с указанной часовой зоной. |
Подробное описание методов
system
static InstantSource system()
Этот источник основан на лучших доступных системных часах. Он может использовать System.currentTimeMillis(), или часы с более высокой точностью, если они доступны.
Возвращаемая реализация неизменяема, потокобезопасна и Serializable.
- Возвращает:
- источник, использующий лучшие доступные системные часы, не null
tick
static InstantSource tick(InstantSource baseSource, Duration tickDuration)
Этот источник будет тикать только согласно указанной продолжительности. Таким образом, если продолжительность составляет полсекунды, источник будет возвращать моменты времени, усечённые до ближайшей полсекунды.
Продолжительность тика должна быть положительной. Если она имеет дробную часть, меньшую целого миллисекунда, то продолжительность должна делиться на одну секунду без остатка. Все обычные продолжительности тиков будут соответствовать этим критериям, включая любые кратные часы, минуты, секунды и миллисекунды, а также разумные наносекундные продолжительности, такие как 20нс, 250 000нс и 500 000нс.
Продолжительность в ноль или одну наносекунду не будет оказывать никакого эффекта усечения. Передача одного из этих значений вернёт исходный источник.
Реализации могут использовать стратегию кэширования для повышения производительности. В связи с этим, возможно, что начало запрошенной продолжительности, наблюдаемой через этот источник, будет позже, чем наблюдаемое непосредственно через базовый источник.
Возвращаемая реализация неизменяема, потокобезопасна и Serializable при условии, что базовый источник таковым является.
- Параметры:
-
baseSource- базовый источник для построения источника тиков, не null -
tickDuration- продолжительность каждого видимого тика, не отрицательная, не null - Возвращает:
- источник, тикающий целыми единицами продолжительности, не null
- Исключения:
-
IllegalArgumentException- если продолжительность отрицательная или имеет дробную часть, меньшую целого миллисекунда, так что продолжительность не делится на одну секунду без остатка -
ArithmeticException- если продолжительность слишком велика для представления в наносекундах
fixed
static InstantSource fixed(Instant fixedInstant)
Этот источник просто возвращает указанный момент времени. Таким образом, он не является источником, представляющим текущий момент времени. Основной случай использования этого - в тестировании, где фиксированный источник гарантирует, что тесты не зависят от текущего источника.
Возвращаемая реализация неизменяема, потокобезопасна и Serializable.
- Параметры:
-
fixedInstant- используемый момент времени, не null - Возвращает:
- источник, который всегда возвращает тот же момент времени, не null
offset
static InstantSource offset(InstantSource baseSource, Duration offsetDuration)
Этот источник оборачивает другой источник, возвращая моменты времени, которые позже на указанную продолжительность. Если продолжительность отрицательная, моменты времени будут раньше текущей даты и времени. Основной случай использования этого - моделирование выполнения в будущем или прошлом.
Продолжительность в ноль не будет иметь эффекта смещения. Передача нуля вернёт базовый источник.
Возвращаемая реализация неизменяема, потокобезопасна и Serializable при условии, что базовый источник таковым является.
- Параметры:
-
baseSource- базовый источник, к которому нужно добавить продолжительность, не null -
offsetDuration- продолжительность для добавления, не null - Возвращает:
- источник, основанный на базовом источнике с добавленной продолжительностью, не null
instant
Instant instant()
Это возвращает момент времени, представляющий текущий момент времени, как определено источником.
- Возвращает:
- текущий момент времени из этого источника, не null
- Исключения:
-
DateTimeException- если момент времени получить невозможно, не выбрасывается большинством реализаций
millis
default long millis()
Это возвращает момент времени, основанный на миллисекундах, измеренный с 1970-01-01T00:00Z (UTC). Это эквивалентно определению System.currentTimeMillis().
Большинство приложений должны избегать этого метода и использовать Instant для представления момента времени на временной шкале, а не значения в миллисекундах. Этот метод предоставляется, чтобы позволить использование источника в высокопроизводительных случаях, когда создание объекта было бы неприемлемым.
- Требования к реализации:
- Основная реализация вызывает
instant(). - Возвращает:
- текущий момент времени в миллисекундах из этого источника, измеренный с эпохи Java 1970-01-01T00:00Z (UTC), не null
- Исключения:
-
DateTimeException- если момент времени получить невозможно, не выбрасывается большинством реализаций
withZone
default Clock withZone(ZoneId zone)
Это возвращает Clock, который является расширением этого интерфейса, объединяющим этот источник и указанную часовую зону.
Возвращаемая реализация неизменяема, потокобезопасна и Serializable при условии, что этот источник таковым является.
- Требования к реализации:
- Основная реализация возвращает неизменяемый, потокобезопасный и
SerializableподклассClock, который объединяет этот источник и указанную зону. - Параметры:
-
zone- используемая часовая зона, не null - Возвращает:
- часы, основанные на этом источнике с указанной часовой зоной, не null
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/InstantSource.html