【发布时间】:2019-04-23 12:12:14
【问题描述】:
在java.util.Scanner 的源代码中,我找到了这些静态实用方法:
private static Pattern separatorPattern() {
Pattern sp = separatorPattern;
if (sp == null)
separatorPattern = sp = Pattern.compile(LINE_SEPARATOR_PATTERN);
return sp;
}
private static Pattern linePattern() {
Pattern lp = linePattern;
if (lp == null)
linePattern = lp = Pattern.compile(LINE_PATTERN);
return lp;
}
为什么它以如此复杂的方式完成,而不仅仅是,说,
private static Pattern linePattern() {
if (linePattern == null)
linePattern = Pattern.compile(LINE_PATTERN);
return linePattern;
}
在这里使用局部变量 (lp) 有什么意义?这是某种优化技术吗?或者可能是防止同时修改?但是linePattern不能再次设置为null,因为这个方法是唯一修改的地方。
【问题讨论】:
-
这是目前唯一修改
linePattern的地方。但是甲骨文非常擅长编写面向未来的代码。也许未来的JDK版本会有另一种修改linePattern的方式,结合这里的代码(你的版本)可能会导致并发修改问题。 -
仅作记录。我在
java.util.Collections.shuffle(List<?> list)中发现了类似的构造。那里有一条评论:“无害的种族”。但是,在该过程中初始化的静态变量不是易失性的。
标签: java variables static initialization