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

为什么Sun/Oracle没有为java.util.regex.Pattern实现对象池? 背景,java,regex,caching,pool,standard-library,Java,Regex,Caching,Pool,Standard Library,在我所从事的每一个大型商业Java项目中,我都会遇到大量的模式的用法。编译(…),甚至在多次重复使用的代码段中,例如 public String rewriteUrlWhichIsDoneABajillionTimes(final String requestedUrl) { Matcher m = Pattern.compile("^/([^/]+)\\.html$").matcher(requestedUrl); if (!m.matches()) { ret

在我所从事的每一个大型商业Java项目中,我都会遇到大量的
模式的用法。编译(…)
,甚至在多次重复使用的代码段中,例如

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

    // Do processing here
    ...
}
对于每一个我发现类似情况的项目,我都会告诉至少一个我正在使用
模式.compile(…)
的人,但是这个类是线程安全的,因此可以安全地重复使用,每次他们都告诉我他们不知道这些事情

潜在解决方案 更正API的未来用法 一个“解决方案”可能是(尝试)强迫人们阅读Java标准库文档,并“正确”使用标准库,但规定性方法往往效果不佳

更正API的过去用法 或者(或者补充)可以“清理”任何
模式的不良用法。编译(…)
无论它们在哪里都可以找到,但这可能是一项永无止境的任务,因为(根据我的经验)人们将继续一次又一次地错误地使用
模式。编译(…)

更正API
那么,为什么不简单地更改
Pattern.compile(…)
方法,使其汇集对象并返回相同的实例以进行等效输入呢?--这将立即对世界上可能有数十亿行代码进行修复(只要使用包含此更改的JRE运行相应的代码)。我能想象到的唯一可能的缺点是该软件会占用更大的内存。。。但是,考虑到现在大多数计算机都有这么多内存,我怀疑这会在边缘情况以外的任何地方引起问题。另一方面,大量的程序可能会运行得更快。那么为什么Oracle没有/没有像他们那样为
模式实现对象池呢?

你可能想在核心lib-dev邮件列表上问这个问题(或者搜索他们的归档文件,看看这个讨论以前有没有浮出水面)?它不会“修复”数十亿行代码,因为它们没有被破坏。如果
模式
被认为是一个瓶颈,那么它可以像代码中任何低效的部分一样得到纠正。他们希望使用API的人在需要时缓存这样的对象(坦率地说,这是有道理的)。同样的字符串,重复使用整数是有意义的(因此缓存在这里也是有意义的)。重复使用相同的模式/匹配器不太常见。如果我创建了1亿个不同的模式,创建了1亿个不同的匹配器呢?。这是在假设与字符串、整数等相比,模式的使用不太常见的情况下完成的@TheLostMind:Java string/integer/etc.pool有一个最大的大小,所以我不认为关于失控内存使用的争论是反对实现对象池的一个好论点;Kayaman:很高兴相信Oracle不应该容纳那些“不知道如何编程”的人,但是,事实上,有大量的代码错误地使用Java标准库,而且总是会有。你可以是指令性的,强迫人们改变,或者你可以改变API——从长远来看,哪一个听起来更有效?