我正在查看Time软件包的Java 8类,并且对没有像LocalDate类这样的构造函数的类有疑问。
如果创建Java类,则该类将始终具有默认的构造函数,但是LocalDate没有构造函数,也就是说,您不能这样做:
LocalDate date = new LocalDate();
如果执行此操作,则会收到编译错误“构造函数LocalDate()未定义”。
为什么LocalDate没有默认的构造函数?
最重要的问题...如何创建没有构造函数的类,该类只能实例化调用静态方法?
非常感谢和问候。
答案 0 :(得分:9)
此处的典型模式是仅包含private
或package default
构造函数的类,并与工厂方法结合使用,该方法既可以是该类的公共静态方法,也可以是附带的工厂类的方法。您可以从in the javadoc列出的许多静态方法中获得LocalDate
个对象。
答案 1 :(得分:3)
使用
LocalDate d = LocalDate.now();
现在创建一个LocalDate。有更多静态方法可实例化LocalDate。 API的设计者决定创建静态方法来实例化LocalDate,因为它们可以在实际实例化的对象上拥有更清晰的名称(例如,上面的“ now()”可以为当前日期创建LocalDate)。
答案 2 :(得分:2)
为什么LocalDate没有默认的构造函数?
因为没有构造它的“默认值”,这才有意义。在这种情况下,年,月和日字段的值是什么?
默认构造函数与带有零参数的显式构造函数不同。默认构造函数是由编译器添加的东西,但如果没有定义其他构造函数(language spec,则仅。 LocalDate
具有显式构造函数,因此没有默认构造函数。该构造函数也是私有的,因此您不能直接调用它。
有效的Java 有一个关于使用静态工厂方法的冗长的条目(它是Item 1或Item 2,我忘记了)。它引用的第一个优点之一是它们的行为类似于命名的构造函数。
很明显,即使不阅读Javadoc,LocalDate.now()
也会返回一个与“ now”相对应的日期。尽管可以使默认构造函数执行相同的操作,但这并不明显。
答案 3 :(得分:0)
Java8 DateTime
库允许访问用于创建对应类的对象的工厂方法,而不是构造函数,因为它提供了灵活性,例如可以在创建对象之前执行某些操作(例如解析)。同样,工厂方法可以具有有意义的名称,而不是构造函数。如其他答案所述,您可以使用:
LocalDate localDate = LocalDate.now(); //creating LocalDate instance