小编典典

“静态”模式不应该总是静态的吗?

java

我刚刚在一些我未编写的代码中发现了一个错误,我对此感到有些惊讶:

Pattern pattern = Pattern.compile("\\d{1,2}.\\d{1,2}.\\d{4}");
Matcher matcher = pattern.matcher(s);

尽管该代码在输入数据上失败了很多 _(因为它试图以17.01.2011格式查找日期并返回诸如10396/2011之类的东西,然后由于无法解析日期而崩溃,但这
确实是错误 的)这个问题的重点;)_我想知道:

  • Pattern.compile 的要点之一不是要进行速度优化(通过预编译正则表达式)?

  • 难道不是所有的“静态”模式都 总是 编译成静态模式吗?

在网络上有很多示例,总是使用 Pattern.compile 重新编译相同的模式,我开始怀疑自己是否在看东西。

不是(假设字符串是静态的,因此不是动态构造的):

static Pattern pattern = Pattern.compile("\\d{1,2}.\\d{1,2}.\\d{4}");

总是比非静态模式引用更可取?


阅读 216

收藏
2020-11-16

共1个答案

小编典典

  1. 是的,预编译a的全部目的Pattern是只执行一次。
  2. 它实际上取决于您将如何使用它,但是通常,存储在static字段中的预编译模式应该没问题。(与Matchers 不同,它们不是线程安全的,因此实际上不应存储在字段中,无论是否为静态)。

静态初始值设定项中有关编译模式的唯一警告是,如果该模式未编译且静态初始值设定项引发异常,则错误的来源可能非常令人讨厌。这是一个较小的可维护性问题,但可能值得一提。

2020-11-16