Как сравнить два java.time.format.DateTimeFormatter?

Из-за того, что DateTimeFormatters не имеет переопределенного метода «равно».

Контрольная работа:

import java.time.format.DateTimeFormatter;

DateTimeFormatter.ofPattern("M/dd/yyyy").equals(DateTimeFormatter.ofPattern("M/dd/yyyy"))

Результат:

false

Это поведение метода Object.equals (). Документация: https://docs.oracle. com / javase / 8 / docs / api / java / time / format / DateTimeFormatter.html.

Методы, унаследованные от класса java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Используйте вариант, когда это необходимо:

Например, мой метод возвращает DateTimeFormatter. И я хотел бы создать тест, чтобы убедиться, что возвращенный DateFormatter верен.

Например:

DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter()
Assert.assertEquals(actualFormatter, expectedFormatter)
0
Dmitry K 14 Сен 2020 в 18:43

2 ответа

Лучший ответ

Вероятно, потому, что определение равенства средства форматирования нетривиально, поскольку существует множество способов создания «того же» средства форматирования (с точки зрения поведения) с помощью построителя, и они редко используются.

У разработчиков JDK есть конечное время. Они отдают приоритет импортным вещам. DateTimeFormatter переопределить equals последовательным и идиоматическим способом намного сложнее, чем может показаться, им лучше провести время в другом месте.

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

Я предлагаю протестировать поведение . Создайте дату (или дату-время) и посмотрите, производят ли оба средства форматирования одинаковый результат.

DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter();

LocalDate someFakeDate = LocalDate.of(2020, 1, 1);
Assert.assertEquals(actualFormatter.format(someFakeDate), expectedFormatter.format(someFakeDate));
3
Michael 14 Сен 2020 в 15:50

Есть способы получить исходный шаблон для сравнения. .

Поскольку DateTimeFormatter является классом final, который не может быть расширен, вы можете заменить все свои экземпляры классом-оболочкой, который создает экземпляр DateTimeFormatter в конструкторе и обеспечивает доступ к сгенерированному { {X3}} и передайте свои пользовательские классы DataTimeFormatterContainer в коде. Это зверь, но он сделает то, о чем вы просите.

Конечно, это точно сравнивает образец; если два неидентичных шаблона генерируют одинаковый результат при синтаксическом анализе даты, это вернет false.

Предложение Barebones; нет нулевых проверок, методов доступа или хэш-кода:

public class DateTimeFormatterContainer() {

    public final String pattern;
    public final DateTimeFormatter formatter;

    public DateTimeFormatterContainer(String pattern) {

        this.pattern = pattern;
        this.formatter = DateTimeFormatter.ofPattern(pattern);
    }

    public boolean equals(DateTimeFormatterContainer that) {

        return this.pattern.equals(that.pattern);
    }
}
0
JoshDM 14 Сен 2020 в 16:13