设计java.util.regex.Pattern和java.util.regex.Matcher的好处是什么?
作者:互联网
我认为似乎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是通过静态方法初始化的?这种可能性带来的好处是什么?是否直接在我的来源上给劣势呼叫创建者带来了不利影响?
解决方法:
为什么通过静态工厂方法创建模式?
A (Pattern) is compiled representation of a regular expression.
Pattern对象将与一个模式相关联,并且该对象的用户应创建一次并使用多次.通过提供静态工厂,Pattern类可以自由地在返回Pattern对象之前执行内部检查.例如,它可以(如果希望)缓存Pattern实例,如果在另一个编译调用中提供了相同的pattern字符串,则返回缓存的实例(注意:尽管这不是其实现方式,但是它具有这种自由度)由于使用静态工厂).
为什么Matcher是通过Pattern上的工厂方法创建的?
匹配器可用于两个目的
(下面是简化透视图,以进行讨论,有关更多详细信息,请参见Java doc of Matcher
):
>检查给定的字符串是否与给定的正则表达式匹配.
>将给定的字符串与给定的模式匹配,并返回各种匹配结果.
对于第一种情况,可以使用Pattern.matches(regex,string)形式的方法调用.在这种情况下,将编译正则表达式,并在匹配后返回布尔结果.请注意,这是一种编程的功能样式-在这里可以正常工作,因为没有要维护的匹配状态.
对于第二种情况,必须保持匹配状态,用户可以在执行匹配后查询.因此,在这种情况下,使用了Matcher对象,该对象可以保持匹配结果的状态.由于没有相应的Pattern对象就不能存在Matcher对象,因此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用作构造函数参数-以便可以在各个点调用它来获取&保持比赛结果
聚苯乙烯
像任何API一样,Pattern和Matcher的实现方式也可能有所不同-并非所有Java API的设计都是一致的-我想开发那些API的开发人员总会有一些特点.上面的答案是我对那些开发人员采用的方法的解释.
标签:software-design,oop,architecture,java 来源: https://codeday.me/bug/20191028/1949072.html