为什么java的Pattern和Matcher类中没有公共构造函数?

我想知道java的Pattern和Matcher类中是否有任何特定的原因没有公共构造函数?

谢谢

许多框架都避免使用直接构造函数来复杂的对象,而是更喜欢更优雅的工厂。

通过’编译’正则表达式生成模式,因此您对’compile’方法进行静态调用。 它初始化了所有必要的东西。 匹配器特定于模式,因此由模式对象而不是由用户直接生成。

如果匹配器具有采用模式的构造函数,则匹配器的构造函数可能必须访问模式对象的非公共字段。

该方法的另一个潜在优点(与直接构造相比)是原则上可以通过在幕后实例化图案和匹配器的不同子类型来向用户透明地提供不同的匹配引擎。 例如,假设您对匹配固定长度字符串的正则表达式(例如,没有通配符)以及包含星号或加号的正则表达式具有不同的匹配器实现,并且存在性能差异。 话虽如此,看起来似乎并不是这样,因为Matcher被定义为最终类,尽管内部结构可能与模式紧密相关。

我没有看过任何一个类的实现,但我认为Pattern.compile()是静态的,因此该类可以缓存最近编译的模式,而不是每次都实例化一个新对象(即一个flyweight)。

java.util.regex.Pattern中compile()的源代码是:

 public static Pattern compile(String regex) { return new Pattern(regex, 0); } 

 public static Pattern compile(String regex, int flags) { return new Pattern(regex, flags); } 

这意味着两个静态方法正在调用私有构造函数。 我认为没有真正的优势,而不是简单地让构造者自己公开。

创建Matcher的唯一公共方法是从Pattern对象到pattern.matcher()方法,这有意义,因为Matcher只存在于Pattern的上下文中。

它是一个静态(或最终)类。 您需要的一切都可以使用compile()和matcher()方法完成。

在我看来,其原因更多地与语义有关。 当您读取Pattern.compile()时,它会传达您的输入将被validation并转换为内部表示的事实,在说出新的Pattern()时可能不会传达相同的消息。

在模式和正则表达式方面,这可能很重要,因为perl所投射的长期历史阴影,API文档中大量记录的比较。