Java Pattern 类没有公共(public)构造函数,为什么?

标签 java design-patterns constructor static-methods factory-pattern

我一直在审查 Java Regex 库,令我惊讶的是 Pattern 类没有我多年来认为理所当然的公共(public)构造函数。

我怀疑静态 compile 方法被用于支持构造函数的一个原因可能是构造函数总是返回一个新对象,而静态方法可能返回一个先前创建的(和缓存的)提供的对象模式字符串是相同的。

然而,事实并非如此,如下所示。

public class PatternCompiler {
    public static void main(String[] args) {
        Pattern first = Pattern.compile(".");
        Pattern second = Pattern.compile(".");
        if (first == second) {
            System.out.println("The same object has been reused!");
        } else {
            System.out.println("Why not just use constructor?");
        }
    }
}

在构造函数上使用静态方法背后还有其他强有力的理由吗?

编辑:我发现了一个 related question这里。那里的答案也没有说服我。通读所有答案,我觉得静态方法在创建对象方面比公共(public)构造函数有很多优势,但反之则不然。真的吗?如果是这样,我将为我的每个类创建这样的静态方法,并安全地假设它更具可读性和灵 active 。

最佳答案

通常,由于以下三个原因之一,类不会有公共(public)构造函数:

  • 该类是实用类,没有理由实例化它(例如,java.lang.Math)。
  • 实例化可能会失败,并且构造函数不能返回 null
  • 静态方法阐明了实例化期间发生的事情背后的含义。

Pattern类中,适用第三种情况——静态compile方法只是为了清晰起见。从解释的角度来看,通过 new Pattern(..) 构建模式没有意义,因为创建新的 Pattern 需要一个复杂的过程。为了解释这个过程,静态方法被命名为 compile,因为 regex 本质上是为了创建模式而编译的。

简而言之,使 Pattern 只能通过静态方法构造是没有编程目的的。

关于Java Pattern 类没有公共(public)构造函数,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13758740/

相关文章:

java - notifyDataSetChanged() 与 invalidateData()

java - 是否可以在多个 Artifactory 实例上运行一个 MySQL 实例

design-patterns - 谁能解释策略模式与控制反转的关系?

c++ - 如何在 C++ 中模拟递归类型定义?

c++ - 最深类继承中的构造函数参数太多?

java - 使用反射创建新对象?

c++ - 没有按预期调用复制构造函数

java - 最有值(value)球员 : : Event Bus pattern instead of Listener

java - 哪种Java Web Framework最适合Google Guice?

java - 是否可以从多类中的构造函数重定向实例?