在我所参与的每个大型商业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 slow和is not cached,但java.util.regex.Pattern class是线程安全的,所以它可以安全地重复使用,每次他们告诉我他们不知道这些东西。
一个“解决方案”可能是(试图)强迫人们阅读Java标准库文档并“正确”使用标准库,但是规范性方法通常不能很好地工作。
或者(或互补),有可能“清理”任何地方Pattern.compile(...)
的任何不良用法,但这可能是一项永无止境的任务,因为(根据我的经验) )人们会一遍又一遍地错误地使用Pattern.compile(...)
......
那么为什么不简单地更改Pattern.compile(...)
方法以便它汇集对象并为相同的输入返回相同的实例? - 这将立即对全世界数十亿行代码应用修复(如只要使用包含更改的JRE运行相应的代码即可。我可以想象的唯一可能的缺点是软件会有更大的内存占用...但考虑到目前大多数计算机有多少内存,我怀疑这会导致除边缘情况以外的任何问题。另一方面,大量的程序可能运行得更快。那么为什么Oracle没有/没有为Pattern
实现对象池的方式与for strings或for primitives的方式相同?