LocalDate не имеет конструктора ... Как мы можем создавать классы без конструктора? - PullRequest
0 голосов
/ 31 августа 2018

Я рассматриваю классы Java 8 пакета Time и у меня есть сомнения относительно классов без конструктора, таких как класс LocalDate.

Если вы создаете класс Java, у этого класса всегда будет конструктор по умолчанию, тем не менее у LocalDate нет конструктора, то есть вы не можете сделать это:

LocalDate date = new LocalDate();

Если вы сделаете это, вы получите ошибку компиляции «конструктор LocalDate () не определен».

Почему у LocalDate нет конструктора по умолчанию?

И самый важный вопрос ... Как я могу создать класс без конструктора, который может быть создан только при вызове статических методов?

Большое спасибо и всего наилучшего.

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Почему у LocalDate нет конструктора по умолчанию?

Потому что для него нет «значения по умолчанию», которое имеет смысл. Какими будут значения полей года, месяца и дня в этом случае?

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

Эффективная Java имеет длинный элемент (это или Элемент 1, или Элемент 2, я забыл, который) об использовании статических фабричных методов. Одним из первых преимуществ, которые он цитирует, является то, что они ведут себя как именованные конструкторы .

Ясно, что даже не читая Javadoc, LocalDate.now() вернет вам дату, которая соответствует «сейчас». Хотя вы можете заставить конструктор по умолчанию делать то же самое, это не будет очевидно.

0 голосов
/ 31 августа 2018

Использование

LocalDate d = LocalDate.now(); 

чтобы создать LocalDate на данный момент. Есть больше статических методов для создания экземпляра LocalDate. Разработчики API решили создать статические методы для создания экземпляров LocalDates, поскольку они могут иметь более четкие имена для того, что на самом деле создается (например, «now ()» выше для создания LocalDate для текущей даты).

0 голосов
/ 31 августа 2018
Библиотека

Java8 DateTime предоставляет доступ к фабричным методам для создания объектов соответствующих классов, в отличие от конструкторов, поскольку она обеспечивает гибкость, например, такие определенные операции, как синтаксический анализ, могут быть выполнены до создания объекта. Также фабричные методы могут иметь осмысленные имена в отличие от конструкторов. Как уже упоминалось в других ответах, вы можете использовать:

LocalDate localDate = LocalDate.now(); //creating LocalDate instance
0 голосов
/ 31 августа 2018

Типичным шаблоном здесь является класс только с конструкторами private или package default в сочетании с фабричным методом, который является либо общедоступным статическим методом класса, либо методом сопутствующего фабричного класса. Вы получаете LocalDate объекты от многих статических методов, перечисленных в javadoc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...