Java.util.regex.Pattern和java.util.regex.Matcher的设计有什么好处?

4

我认为java.util.regex.Pattern和java.util.regex.Matcher之间是聚合关系。Java API中如下所示:

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
为什么要通过静态方法初始化 Pattern 和 Matcher?这样做有什么好处?直接在我的源代码中调用 creator 会有什么缺点吗?

2
构造函数或静态工厂方法的副本。 - Mick Mnemonic
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5

为什么Pattern是通过static工厂方法创建的?

根据Pattern的文档,

(Pattern)是正则表达式的编译表示。

Pattern对象将与一种模式相关联,使用该对象的用户应该创建它一次并多次使用。 通过提供静态工厂,Pattern类可以在返回Pattern对象之前执行内部检查。 例如,如果希望缓存Pattern实例并且在另一个调用compile时提供相同的模式字符串,则可以这样做(请注意:尽管如此,它由于使用静态工厂而具有该自由)。

为什么Matcher是通过Pattern上的工厂方法创建的?

Matcher可以用于两个目的
(为了讨论方便,以下是简化的视角,详见 Matcher的Java文档):

  1. 检查给定字符串是否与给定正则表达式匹配。
  2. 将给定字符串与给定模式进行匹配,并返回各种匹配结果。

对于第一种情况,可以使用Pattern.matches(regex, string)方法调用形式。在这种情况下,正则表达式将被编译,并在匹配后返回布尔结果。请注意,这是一种函数式编程风格 - 在这里它很好地工作,因为没有需要维护的匹配状态。

对于第二种情况,必须维护一个匹配状态,用户可以在匹配完成后查询该状态。因此,在此情况下使用Matcher对象,该对象可以维护匹配结果的状态。由于Matcher对象不能没有相应的Pattern对象而存在,因此API开发人员仅允许通过Pattern实例来创建它 - 因此用户可以调用p.matcher('aaaaab')。在内部,Pattern类中的代码如下:
public Matcher matcher(CharSequence input) {
    if (!compiled) {
        synchronized(this) {
            if (!compiled)
                compile();
        }
    }
    Matcher m = new Matcher(this, input);
    return m;
}
可以看到,MatcherPattern 作为构造函数参数 - 以便在各个点调用它以获取和维护匹配结果。 附言
像任何 API 一样,PatternMatcher 也可以以不同的方式实现 - 并非所有 Java API 的设计都是一致的 - 我想开发这些 API 的开发人员总会留下一些自己的特点。上述答案是我对这些开发人员采取的方法的解释。

感谢巫师。如何获取软件设计等问题的答案?只需阅读Java文档并理解吗?如果没有向stackoverflow提问,我无法解决我的问题。 - DongHoon Kim
你可以阅读关于OOAD的书籍,例如《Head First OOAD》、《Head First Design Patterns》,这些书以易于理解的方式解释概念。通常当你在一段时间后重新学习某个主题时,事情会变得更加清晰明了。此外,你可以参加在线课程,观看YouTube上的教程。当然,你也可以在stackoverflow上查找答案,并在有新问题时提问。不幸的是,学习没有捷径,你必须付出努力。 - Wand Maker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,