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

时间:2013-11-19 13:41:39

标签: java list design-patterns model javabeans

我正在创建一个包含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.
}

我见过的第二个用于另一个项目 - 似乎更好但我不确定这个设计来自哪里。任何人都可以指出我的文章命名模式和/或描述它的好处吗?

3 个答案:

答案 0 :(得分:1)

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

通常情况下,你的课程中的状态越少,不变性就越大。这样做的原因是,如果您的状态较少,则产生错误的可能性较小。

在您的情况下,例如,如果您使用第一种方法,那么您无法确保其他人没有为您的模型设置另一个列表。在第二种情况下,您无法确保有人不会在您的列表中拨打clear()

最后一切都取决于您的使用案例。如果您希望您的类保留一个列表但您不希望将来进行任何更改,则应使用不可变列表。否则,尽可能多地限制可变性。

答案 1 :(得分:1)

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

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
    }
}

答案 2 :(得分:0)

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

第二个允许你这样做而不需要获取列表并在之后重置它!