Я хотел бы создать копию java.time.LocalDateTime, но в ней нет метода clone().
Я делаю следующее:
long epochMilli = Instant.now().toEpochMilli();
LocalDateTime createDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
LocalDateTime modificationDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
Есть ли самый простой способ создать два объекта LocalDateTime с одним и тем же значением даты и времени?




Поскольку LocalDateTime неизменяем, вы можете просто сослаться на один и тот же объект:
LocalDateTime createDate = LocalDateTime.now();
LocalDateTime modificationDate = createDate;
@Eugene Неизменяемые классы считаются типами значений, их уникальность связана со значением, которое они хранят, а не там, где они находятся в памяти, нет необходимости создавать 2 отдельных экземпляра. Поскольку этот экземпляр LocalDateTime нельзя изменить, вы можете использовать его столько же ссылок.
@FilipRistic Придется согласиться, у меня здесь плохо: |
@FilipRistic, но возникает интересный вопрос ... что clone должен делать для типов значений, чем?
@Eugene Это действительно интересный вопрос, clone по стандарту должен возвращать новый экземпляр, но не все должно быть Cloneable. С моей точки зрения, типы значений никогда не должны быть Cloneable, поскольку нет никакого использования для создания клонов чего-то, что представляет ценность, потому что они имеют одинаковые значения, что снова делает их полностью одинаковыми. Например, никто никогда не клонирует номер 5, чтобы получить еще 5, объекты значений такие же, они связаны со значением, которое они хранят, а не с адресом памяти.
Поскольку LocalDateTime неизменяемый, согласно его Javadoc нет реальной причины для его клонирования.
Вы можете просто использовать один и тот же экземпляр и передавать его без необходимости клонировать его в целях защиты и терять производительность.
Поскольку он неизменен, вы можете сделать это следующим образом:
LocalDateTime copy = createDate.plusHours(0);
System.out.println(createDate.equals(copy)); // true
Returns a copy of this LocalDateTime with the specified number of hours added. This instance is immutable and unaffected by this method call.
На моей Java 10 это только что вернуло тот же объект, а не копию.
@ OleV.V. Я просто прочитал исходный код, он возвращает тот же объект, когда приращение равно 0 ...
LocalDateTime orig = LocalDateTime.now();
LocalDateTime copy = LocalDateTime.from( orig );
отредактировал: этот код вернет тот же объект из источников LocalDateTime:
public static LocalDateTime from(TemporalAccessor temporal) {
if (temporal instanceof LocalDateTime) {
return (LocalDateTime) temporal;
}
...
На моей Java 10 это только что вернуло тот же объект, а не копию.
Да, на самом деле он возвращает тот же объект
Почему вы хотите клонировать? И имейте в виду, что все управляемые экземпляры являются естественно новыми объектами из-за функции неизменности. Так в чем ваша цель или намерение?