为什么Sun / Oracle没有为java.util.regex.Pattern实现对象池?

时间:2015-08-12 07:36:53

标签: java regex caching pool standard-library

背景

在我所参与的每个大型商业Java项目中,即使在多次重复使用的代码段中,我也会遇到Pattern.compile(...)的大量用法,例如

public String rewriteUrlWhichIsDoneABajillionTimes(final String requestedUrl) {
    Matcher m = Pattern.compile("^/([^/]+)\\.html$").matcher(requestedUrl);
    if (!m.matches()) {
        return null;
    }

    // Do processing here
    ...
}

对于我发现这样的事情的每个项目,我告诉至少一个与我合作的人Pattern.compile(...) is very slowis not cached,但java.util.regex.Pattern class是线程安全的,所以它可以安全地重复使用,每次他们告诉我他们不知道这些东西。

潜在解决方案

正确使用API​​

一个“解决方案”可能是(试图)强迫人们阅读Java标准库文档并“正确”使用标准库,但是规范性方法通常不能很好地工作。

更正API的过去用法

或者(或互补),有可能“清理”任何地方Pattern.compile(...)的任何不良用法,但这可能是一项永无止境的任务,因为(根据我的经验) )人们会一遍又一遍地错误地使用Pattern.compile(...) ......

更正API

那么为什么不简单地更改Pattern.compile(...)方法以便它汇集对象并为相同的输入返回相同的实例? - 这将立即对全世界数十亿行代码应用修复(如只要使用包含更改的JRE运行相应的代码即可。我可以想象的唯一可能的缺点是软件会有更大的内存占用...但考虑到目前大多数计算机有多少内存,我怀疑这会导致除边缘情况以外的任何问题。另一方面,大量的程序可能运行得更快。那么为什么Oracle没有/没有为Pattern实现对象池的方式与for stringsfor primitives的方式相同?

0 个答案:

没有答案