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

时间:2010-03-08 18:13:47

标签: java

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

由于

5 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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);
}

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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