繁体   English   中英

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

[英]Why are there no public constructors in Pattern and Matcher classes of java?

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

谢谢

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

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

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

这种方法的另一个潜在优势(与直接构建相比)是,原则上可以通过实例化幕后的Pattern和Matcher的不同子类型为用户透明地提供不同的匹配引擎。 例如,假设对于匹配固定长度字符串(例如,没有通配符)的正则表达式以及包含星号或加号的正则表达式,您具有不同的匹配器实现,并且存在性能差异。 话虽这么说,因为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.matcher()方法从Pattern对象中进行选择,这很有意义,因为Matcher仅存在于Pattern的上下文中。

它是静态(或最终)类。 您需要的所有内容都可以通过compile()和matcher()方法完成。

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

在模式和正则表达式方面,这可能很重要,因为perl会留下很长的历史阴影,在API文档中已大量记录了与之比较的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM