Don*_*Kim 4 java architecture oop software-design
好像是 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();
Run Code Online (Sandbox Code Playgroud)
为什么 Pattern 和 Matcher 是通过静态方法初始化的?放置这种可能性有什么好处?直接在我的来源上对呼叫创建者不利吗?
为什么Pattern是static工厂方法创建的?
根据 的文档Pattern,
A (Pattern) 是正则表达式的编译表示。
一个Pattern对象将与一个模式相关联,这个对象的用户应该创建一次并多次使用它。通过提供静态工厂,Pattern类可以在返回Pattern对象之前自由执行内部检查。例如,如果Pattern在另一个调用中提供了相同的模式字符串,它可以(如果它希望)缓存实例并返回缓存的实例compile(注意:虽然这不是它的实现方式,但是,由于使用静态工厂)。
为什么Matcher是通过工厂方法创建的Pattern?
Matcher可以用于两个目的
(以下是为了讨论的简化透视图,更多细节请参考Java 文档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;
}
Run Code Online (Sandbox Code Playgroud)
可以看出,Matcher需要Pattern作为构造参数-以便它可以在不同的点调用它来获得和维持比赛结果
PS
与任何 API 一样,Pattern和 的Matcher实现方式也可能略有不同 - 并非所有 Java API 在其设计上都是一致的 - 我想开发这些 API 的开发人员总会留下一些特征。以上答案是我对这些开发人员采用的方法的解释。