ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-28 02:00:42  阅读:190  来源: 互联网

标签:software-design oop architecture java


我认为似乎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是通过静态方法初始化的?这种可能性带来的好处是什么?是否直接在我的来源上给劣势呼叫创建者带来了不利影响?

解决方法:

为什么通过静态工厂方法创建模式?

根据documentation of Pattern,

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有