首页 > 解决方案 > 为什么 java.time 使用 'of' 而不是 'new' 作为日期?

问题描述

在 Java 8 的新日期包中,我们从使用“ new Date()”更改“LocalDate.of ()”。

Date d = new Date(year, month, dayOfMonth);            //Old way
LocalDate d2 = LocalDate.of(year, month, dayOfMonth);  //new way

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

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

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

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

标签: javadatejava-8java-time

解决方案


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

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

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

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

由于上述原因,在当今的编程中,静态工厂优于构造函数。但是,如果new情况允许,您仍然可以将关键字与构造函数一起使用。


推荐阅读