我一直在审查 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/