延迟初始化集合的最佳方法是什么,我专门研究Java。我见过有人决定在修改方法中执行此操作(这似乎有些麻烦),如下所示:
public void addApple(final Apple apple) {
if (this.apples == null) {
apples = new LinkedList<Apple>();
}
this.apples.add(apple);
}
您可以将初始化重构为一个方法,然后从添加/删除/更新等中调用它。。。但这似乎有些麻烦。人们还通过以下方式公开收藏集本身,这通常使情况更加复杂:
public Collection<Apple> getApples() {
return apples;
}
这会破坏封装并导致人们直接访问集合。
延迟初始化的目的纯粹是与性能有关。
我很好奇,看看其他人提出的解决方案是什么。有任何想法吗?
最佳答案
我将懒惰的实例放入给定函数的getter中。通常,如果可能的话,我会延迟实例化列表以避免DB命中。例:
public final Collection<Apple> getApples() {
if (apples == null) {
// findApples would call the DB, or whatever it needs to do
apples = findApples();
return apples;
}
public void addApple(final Apple apple) {
//we are assured that getApples() won't return
//null since it's lazily instantiated in the getter
getApples().add(apple);
}
这种方法意味着其他函数(例如removeApples())也无需担心实例化。他们也只会调用getApples()。