延迟初始化集合的最佳方法是什么,我专门研究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()。

07-27 21:34