#java #jodatime
#java #jodatime
Вопрос:
Я хочу новый экземпляр, который является копией. Я мог бы создать экземпляр из целых чисел, но, похоже, должен быть более прямой способ. Я мог бы также использовать какой-нибудь подход, подобный copy = original.minus(zero)
но это тоже косвенный.
Конструктор LocalTime, который принимает аргумент объекта Java (для которого я использовал исходное LocalTime), не работает. Я думаю, он просто не поддерживает это.
LocalTime start = new LocalTime(9, 0, 0);
LocalTime stop = new LocalTime(17, 0, 0);
//LocalTime time = start.minusSeconds(0); // GOOD VERSION
LocalTime time = new LocalTime(start); // THE BAD VERSION
assert time == start: "does not work";
// EXTRANEOUS STUFF TO JUSTIFY COPYING AN IMMUTABLE, FOLLOWS...
while (time.compareTo(stop) <= 0)
{
//method(time, new LocalTime(9, 0, 0), stop); // MESSY
method(time, start, stop); // NICER
time = time.plusMinutes(1);
}
Я также пытался, copy = new LocalTime(original.getLocalMillis())
но у меня нет доступа к getLocalMillis
, поскольку он защищен.
Комментарии:
1. Причина, по которой ваше утверждение не выполняется, заключается в том, что
==
сравнивает ссылки на объекты, а не значения внутри них. Вашиstart
иend
ссылки указывают на разные объекты (они оба былиnew
созданы отдельно), которые, оказывается, имеют одинаковые значения. Вместо этого вам следует использовать.equals()
метод вместо. Прочтите это: leepoint.net/notes-java/data/expressions/22compareobjects.html
Ответ №1:
LocalTime является неизменяемым, поэтому нет смысла сохранять 2 экземпляра с одинаковым значением. Они могут быть общими (даже для разных потоков). Методы мутации, например plus / minus, вернут новое значение, так что вы можете создать свою копию «по требованию», когда вам понадобится измененное значение.
LocalTime start = new LocalTime(9, 0, 0);
LocalTime stop = new LocalTime(17, 0, 0);
LocalTime time = start; // Just use the reference
while (time.compareTo(stop) <= 0)
{
method(time, start, stop);
time = time.plusMinutes(1);
}
Комментарии:
1. Я не буду удерживать 2 идентичных экземпляра, потому что я буду увеличивать копию в цикле. Я все еще хочу оригинал, потому что «оригинал» читать приятнее, чем «новое LocalTime (a, b, c)»
2. Если быть более точным, поскольку объект неизменяем, никакого фактического увеличения не будет, но предыдущий «увеличенный» объект получит сбор мусора, и у меня все еще есть ссылка на оригинал.
3. Я все еще не понимаю причину копирования. Просто придерживайтесь исходной ссылки. Создание копии, чтобы оригинал мог быть GC’d, не дает никакой выгоды, поскольку вы выделяете ровно столько объектов, сколько вы разрешаете использовать GC’d. Возможно, было бы полезно опубликовать упрощенную версию вашего цикла.
Ответ №2:
Для меня это работает просто отлично:
LocalTime t1 = new LocalTime();
try {
// Sleep for a bit just to make sure the current system time moves on
Thread.sleep(5000);
} catch (InterruptedException e) { }
LocalTime t2 = new LocalTime(t1);
assertEquals(t1, t2);
Обратите внимание на предпоследнюю строку — я думаю, это то, что вы ищете. t2
получает то же время в миллисекундах, что и эпоха t1
.
Итак, что именно вы имеете в виду, когда говорите, что конструктор копирования (который я использовал OK выше) «не работает»?
Комментарии:
1. Я опубликую свой код, чтобы показать, что он не сработал. Вы уверены, что в вашей IDE включено утверждение?
2. Я не знаю, почему это было отклонено. Меня довольно шокирует, что в Eclipse по умолчанию отключено утверждение.
3. Вздох, я бы хотел, чтобы даунвотеры объяснились сами. Я запустил этот код перед его публикацией, и он работает, и он отвечает на вопросы OP. @broiyan — Я использовал
assertEquals()
из TestNG, если это поможет.4. Смотрите мой комментарий к вашему исходному сообщению — ваш assert() был закодирован неправильно.