我认为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 会有什么缺点吗?
我认为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 会有什么缺点吗?
为什么Pattern
是通过static
工厂方法创建的?
根据Pattern
的文档,
(Pattern)是正则表达式的编译表示。
Pattern
对象将与一种模式相关联,使用该对象的用户应该创建它一次并多次使用。 通过提供静态工厂,Pattern
类可以在返回Pattern
对象之前执行内部检查。 例如,如果希望缓存Pattern
实例并且在另一个调用compile
时提供相同的模式字符串,则可以这样做(请注意:尽管如此,它由于使用静态工厂而具有该自由)。
为什么Matcher
是通过Pattern
上的工厂方法创建的?
Matcher
可以用于两个目的
(为了讨论方便,以下是简化的视角,详见 Matcher
的Java文档):
对于第一种情况,可以使用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;
}
可以看到,Matcher
以 Pattern
作为构造函数参数 - 以便在各个点调用它以获取和维护匹配结果。
附言Pattern
和 Matcher
也可以以不同的方式实现 - 并非所有 Java API 的设计都是一致的 - 我想开发这些 API 的开发人员总会留下一些自己的特点。上述答案是我对这些开发人员采取的方法的解释。