似乎java.util.regex.Pattern和java.util.regex.Matcher是聚合关系,我想。而java API表示在下面使用它们。
C:\ProgramData\Your_App
为什么Pattern和Matcher是通过静态方法初始化的?放置这种可能性有什么好处?它是不是直接在我的源上调用创建者?
答案 0 :(得分:4)
为什么Pattern
由static
工厂方法创建?
A(Pattern)是正则表达式的编译表示。
Pattern
对象将与模式相关联,并且此对象的用户应该创建一次并多次使用它。通过提供静态工厂,Pattern
类可以在返回Pattern
对象之前自由执行内部检查。例如,它可以(如果它希望)缓存Pattern
实例并返回缓存实例,如果在另一个compile
调用中提供了相同的模式字符串(注意:这不是它实现的方式)但是,由于使用静态工厂,它具有自由度。)
为什么在Matcher
上通过工厂方法创建Pattern
?
Matcher
可用于两个目的
(以下是为了便于讨论的简化视角,请参阅Java doc of Matcher
了解更多详情):
对于第一种情况,可以使用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;
}
可以看出,Matcher
将Pattern
作为构造函数参数 - 以便它可以在各个点调用它来获取&保持匹配结果
<强> PS 强>
与任何API一样,Pattern
和Matcher
的实现方式可能也有所不同 - 并非所有Java API在设计上都是一致的 - 我想开发人员总是有一些开发人员的特性背后。以上答案是我对这些开发人员采取何种方法的解释。