Почему у LocalDateTime нет конструктора String?

Недавно я столкнулся со следующей ошибкой при попытке опубликовать данные JSON через Spring MVC в POJO, который имеет LocalDateTime:

no String-argument constructor/factory method to deserialize from String value

Чтобы решить эту ошибку, мне пришлось изменить свой сеттер с

public void setToDate(LocalDateTime toDate) {
    this.toDate = toDate;
}

to

public void setToDate(String toDate) {
    this.toDate = LocalDateTime.parse(toDate);
}

Это оставило меня с вопросом, почему LocalDateTime не имеет конструктора String, а также статического parse()?


person Toby Cook    schedule 05.03.2020    source источник
comment
Вам не нужно менять сеттер, вы можете оставить сеттер по умолчанию с помощью LocalDateTime. Вы можете просто использовать myobj.setToDate(LocalDateTime.parse("...")). Конструктора LocalDateTime(String) нет, потому что String используются по-разному. Это не объект для даты/времени   -  person KunLun    schedule 05.03.2020
comment
@KunLun Данные отображаются из @ResponseBody в запросе POST. Поэтому я не могу передать проанализированную дату в качестве аргумента.   -  person Toby Cook    schedule 05.03.2020
comment
Я думаю, что это связано с этим заголовком stackoverflow.com/questions/38424319/ (см. ссылку на книгу Effective Java)   -  person JuanMoreno    schedule 05.03.2020
comment
@TobyCook, потому что одной строки недостаточно. Вам также необходимо знать, как он отформатирован (например)   -  person Stultuske    schedule 05.03.2020


Ответы (1)


(Почти) ни один из классов в java.time вообще не имеет конструктора, по крайней мере, общедоступных конструкторов. Вы можете создать экземпляр этих классов, только вызвав один из статических методов фабрики (одним из них является ~.parse()).

Конечно, это было дизайнерское решение при создании пакетов java.time.

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

person tquadrat    schedule 05.03.2020