对于不可变对象,适合将包含的集合包装为不可修改的地方在哪里?我看到3个选项:不可变对象和不可修改集合
处于不可改变对象的工厂:
public class ImmutableFactory { public Immutable build(){ List<Integer> values = new ArrayList<Integer>(); values.add(1); values.add(2); values.add(3); return new Immutable(Collections.unmodifiableList(values), "hello"); } }
处于不可改变的构造器
public class Immutable { private final List<Integer> values; private final String hello; public Immutable(List<Integer> values, String hello) { this.values = Collections.unmodifiableList(values); this.hello = hello; } public List<Integer> getValues() { return values; } public String getHello() { return hello; } }
处于不可改变的访问(如适用)。
public class Immutable { private final List<Integer> values; private final String hello; public Immutable(List<Integer> values, String hello) { this.values = values; this.hello = hello; } public List<Integer> getValues() { return Collections.unmodifiableList(values); } public String getHello() { return hello; } }
是否有任何其他选项,哪一个是正确的?
伟大的观点。自从我一直专注于不变性以来,我会给番石榴一枪。 –
如果您有一个返回集合'值'的getter,您会返回一个List或ImmutableList类型吗? –
我只是返回'List'。 (这就是说,番石榴是聪明有关 - 如果你调用'ImmutableList.copyOf'防守这已经不可改变的名单上,它不会实际做的副本,除了在情况下,这将导致内存泄漏。) –