Каква е целта или стойността на създаването на локална препратка към статична променлива променлива, която вече се съхранява като членско поле. Този код тук е от java.util.Scanner JDK 6b14 тук.
class Scanner {
private static volatile Pattern linePattern;
...
private static Pattern linePattern() {
Pattern lp = linePattern;
if (lp == null)
linePattern = lp = Pattern.compile("...");
return lp;
}
...
}
Уроците по Java: „Четенето и писането са атомарни за всички променливи, декларирани като непостоянни (включително дълги и двойни променливи)... всяко записване в променлива променлива установява връзка преди да се случи с последващо четене на същата променлива."
Това означава, че четенето на препратката към обекта Pattern няма да се провали наполовина, защото се е променило. Ключовата дума volatile трябва да защитава точно тези видове достъп, така че не смятам, че дублиращата се локална променлива е предназначена да гарантира, че се връща валидна стойност.
Също така, мързеливата инициализация може да се извърши в полето член, без да е необходима междинна локална променлива:
if (linePattern == null) linePattern = Pattern.compile("...");
Изглежда, че това е оптимизация на байт код, както се вижда тук и тук. Използването на локални променливи създава по-малък байт код (по-малко инструкции), както и по-малко достъпи до действителната стойност (което е скъпо променливо четене). Въпреки това те не са използвали окончателната оптимизация на променливата заедно с нея, така че съм скептичен да направя това заключение.