为什么 java.time 对日期使用“of”而不是“new”?

Dav*_*iel 5 java date java-8 java-time

在新的日期包的Java 8中,我们使用“更改日期()”到“LOCALDATE的。()”。

Date d = new Date(year, month, dayOfMonth);            //Old way
LocalDate d2 = LocalDate.of(year, month, dayOfMonth);  //new way
Run Code Online (Sandbox Code Playgroud)

当您想要一个新对象时,您通常使用new关键字。这是创建新对象的直观方式。

有时,当您需要延迟初始化的单例时,您可以使用静态方法来获取实例。在这种情况下,您必须调用它,getInstance()以便开发人员知道会发生什么。

这种新语法使代码不那么直观。它迫使您学习如何处理特定对象,而不是简单地使用它们。

这种变化有什么好的理由吗?

Rav*_*ala 5

通常静态工厂方法比构造函数更受欢迎,原因有几个,

  • 它们有一个名称,这使您的代码更具可读性。
  • 静态工厂方法可以具有协变返回类型,但构造函数不能。这允许您的 API 用户使用接口而不是实现,从而为您在未来版本中更改具体类型提供更多空间。此外,它还减少了 API 的概念表面积。
  • 与构造函数不同,静态工厂方法可以进行某些优化。相反,每次调用构造函数时,都希望它返回一个新对象。例如,查看静态工厂方法的实现 Collections.emptyList();
public static final List EMPTY_LIST = new EmptyList<>();

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
Run Code Online (Sandbox Code Playgroud)

它急切地创建一个单例列表并在每次调用时返回它,从而节省使用构造函数时会发生的不必要的开销。

由于上述原因,在当今的编程中,静态工厂比构造函数更受欢迎。但是,您仍然可以new根据情况将关键字与构造函数一起使用。

  • 它允许从公共 API 中隐藏实际的实现类,示例中的“EmptyList”。在“java.time”的情况下,这些类进一步显式标记为[基于值](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/ lang/doc-files/ValueBased.html) 类。 (4认同)
  • 很好,我已将其添加到第 2 点。欣赏它。谢谢 ! (2认同)