如何在Java类中实现Collection字段的getter/setter



我正在创建一个包含List的JavaBean,它可以考虑两种可能性:

public class JavaBeanWithSettableList {
    private List<Integer> list;
    public List<Integer> getList {
        return list;
    }
    public void setList(final List<Integer> list) {
        this.list = list;
    }
}

public class JavaBeanWithUnsettableList {
    private List<Integer> list = new ArrayList<Integer>();
    public List<Integer> getList {
        return this.list;
    }
    // No setter - need to use list.add(), list.remove() etc.
}

我在另一个项目中看到的第二个——它看起来更好,但我不确定这个设计是从哪里来的。有人能给我指一篇文章来命名这种模式和/或描述它的好处吗?

此模式没有名称。第一个只是一个带有List的类,第二个是一个内部创建的列表。

一般来说,类中的状态越少,不变性越强越好。这样做的原因是,如果你的状态较少,那么产生错误的机会就较小。

在您的情况下,例如,如果您使用第一种方法,那么您无法确保其他人不会为您的模型设置另一个列表。在第二种情况下,你不能确保有人不会打电话给你名单上的clear()

最终,这一切都取决于您的用例。如果你希望你的类保存一个列表,但你不希望将来有任何更改,你应该使用一个不可变的列表。否则,尽可能地限制可变性。

两者都不是最优的。大概你想要。。。

public class ModelList {
    private List<Integer> list;
    ModelList() {
        this.list = new ArrayList<Integer>();
    }
    ModelList(final List<Integer> list) {
        this.list = list;
    }
    public ArrayList<Integer> getList {
       return new ArrayList<Integer>(list); // Send back a copy, to make Immutable
    }
}

第一个的问题是,每次想要更新列表时,都需要创建一个新列表,从模型中获取列表,添加元素并将新列表设置到模型中。

第二个可以让你做到这一点,而不需要获得列表并在之后重置它!

最新更新