2016-03-16 1 views
1

У меня есть следующий код:Использование равных и == на LocalDate Object

LocalDate one = LocalDate.of(2016, 1, 1); 
LocalDate two = LocalDate.of(2016, 1, 1); 
System.out.println(one.equals(two)); // true since contents are same 
System.out.println(one == two); // false since references are diff 
LocalDate newone = one.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY)); 
System.out.println(newone.equals(one));// true since contents are still same 
System.out.println(newone == one); //-4- why true here 

Вопрос в том, почему на 4 она дает истинное как объекты LocalDate неизменны так сменяющих друг с TemporalAdjuster даст новый LocalDate объект , Если содержимое newone и один не совпадают с содержанием

newone == one returns false 

Просьба уточнить это поведение. Благодаря

+1

Я не смотрел код, но 'nextOrSame' имеет в нем слово« тот же », поэтому ... –

+1

Очевидно, что эта настройка не изменяет объект, так как 2016-01-01 уже в пятницу. –

ответ

4

Посмотрите на код TemporalAdjusters.nextOrSame:

public static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek) { 
    int dowValue = dayOfWeek.getValue(); 
    return (temporal) -> { 
     int calDow = temporal.get(DAY_OF_WEEK); 
     if (calDow == dowValue) { 
      return temporal; // <-- returns the original object! 
     } 
     int daysDiff = calDow - dowValue; 
     return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, DAYS); 
    }; 
} 

Из documentation (курсив мой):

Возвращает следующий или-же день-неделю регулятор, который корректирует дату до первого вхождения указанного дня недели после даты корректировки, если она уже в тот день, в этом случае тот же объект возвращается.

Так что, если регулировка не требуется (потому что 1 января 2016 года был в пятницу), то тот же объект возвращается.

-1

Вы можете передать документы здесь java docs

public LocalDate with(TemporalAdjuster adjuster) 

Возвращает скорректированную копию этой даты.

Таким образом, объект, который возвращается, является копией объекта, поэтому ссылка такая же, поэтому ваш результат возвращает true.

+2

Это был _copy_ в этом случае, тогда '==' would_not_ вернет true. –

0

Правильный номер Answer by tobias_k.

Избегайте испытаний равенство ссылок на ценностно-ориентированные объекты

Я только добавить, что, вообще говоря, следует избегать использования == в Java, как просто проверяет на равенство ссылок, с просьбой, если две ссылки на переменные указывают на тот же самый объект, выделенный в памяти. Почти всегда подходит вызов equals или собственный метод проверки равенства.

В частности, LocalDate класс документ предупреждает против делает этот тест равенство ссылок на объекты такого класса value-based.

Это класс, основанный на значении; использование идентификационных операций (включая ссылочное равенство (==), хэш-код идентификатора или синхронизацию) в экземплярах LocalDate может иметь непредсказуемые результаты и их следует избегать. Метод equals должен использоваться для сравнения.

Хотя я понимаю, что пользователь2779311, по-видимому, намеревался использовать этот тест равенства как интеллектуальное упражнение, хочу отметить, что такой тест, как правило, не подходит в производственном коде.

Смежные вопросы