问题让我们来看下面这个简单的程序:
import java.util.*;
class Aquarium {
private ArrayList
public static void main(String[] args) {
var aquarium = new Aquarium();
System.out.println(aquarium.getFish());
// fish has already been initialized
System.out.println(aquarium.getFish()); // line n1
}
private ArrayList
if (fish == null) initFish();
return fish;
}
private void initFish() {
fish = new ArrayList<>(Arrays.asList(
new Fish("Bubbles"),
new Fish("Calypso"),
new Fish("Dory")
));
}
}
class Fish {
private String name;
Fish(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
在此代码中,我们有一个实例变量 fish ,该变量被打印了两次。 它采用了延迟初始化,在我们的例子中,这意味着该字段在其 getter 被调用之前不会被赋值。
考虑这样一种情况:您已经执行到 line n1 ,并且 fish 已经被初始化,但您想查看 initFish 方法? 此方法仅在 (fish == null) 计算结果为 true 时才会执行,而在 line n1 时已不再是这种情况。
对于这个简单的程序,我们可以重新启动会话。 然而,在更复杂的情况下,您可能会发现重新启动会话并重现导致某种状态的步骤非常不方便。 让我们学习更聪明的方法。