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

时间:2015-08-09 14:57:54

标签: java oop architecture software-design

似乎java.util.regex.Pattern和java.util.regex.Matcher是聚合关系,我想。而java API表示在下面使用它们。

C:\ProgramData\Your_App

为什么Pattern和Matcher是通过静态方法初始化的?放置这种可能性有什么好处?它是不是直接在我的源上调用创建者?

1 个答案:

答案 0 :(得分:4)

为什么Patternstatic工厂方法创建?

根据documentation of Pattern

  

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

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

为什么在Matcher上通过工厂方法创建Pattern

Matcher可用于两个目的
(以下是为了便于讨论的简化视角,请参阅Java doc of Matcher了解更多详情)

  1. 检查给定的字符串是否与给定的正则表达式匹配。
  2. 将给定字符串与给定模式匹配,并返回各种匹配结果。
  3. 对于第一种情况,可以使用Pattern.matches(regex, string)形式的方法调用。在这种情况下,将编译正则表达式并在匹配后返回布尔结果。请注意,这是一种functional编程风格 - 它在这里工作正常,因为没有要维护的匹配状态。

    对于第二种情况,必须维护匹配状态,用户可以在执行匹配后查询。因此,在这种情况下,使用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作为构造函数参数 - 以便它可以在各个点调用它来获取&保持匹配结果

    <强> PS
    与任何API一样,PatternMatcher的实现方式可能也有所不同 - 并非所有Java API在设计上都是一致的 - 我想开发人员总是有一些开发人员的特性背后。以上答案是我对这些开发人员采取何种方法的解释。