我们如何确保在不可变对象中定义的 ArrayList 的不可变性?
How can we ensure the immutability of a ArrayList defined in a Immutable Object?
如果我在 Java 中定义一个 ArrayList,它是私有的、最终的并且只有 getter。用户仍然可以获取 ArrayList 并通过添加或删除其中的元素来修改 ArrayList。我怎样才能避免这种情况?
您可以从列表中创建一个不可修改的列表。 Collections class 有一个实用方法。
List<String> unModifiableList=Collections.unmodifiableList(
oldList);
在您的实际对象中准备好列表后,您可以将其冻结。
Unmodifiable List 是您必须采取的方法。但是有一个限制,因为这个不可修改的 class 正在采用一个通常的列表并且它仍然是可修改的。
final List<String> modifiable = new ArrayList<>();
modifiable.add("Java");
modifiable.add("is");
final List<String> unmodifiable = Collections.unmodifiableList(modifiable);
System.out.print("Before modification: " + unmodifiable);
modifiable.add("the");
modifiable.add("best");
System.out.print("After modification: " + unmodifiable);
在上面的代码段中,输出如下所示。
Before modification: [Java, is]
After modification: [Java, is, the, best]
阅读 this article 以了解 unmodifiableList 的陷阱 及其解决方案。
您可以在 getter 方法中 return List 的新实例,并将您的列表作为构造函数参数。
如果我在 Java 中定义一个 ArrayList,它是私有的、最终的并且只有 getter。用户仍然可以获取 ArrayList 并通过添加或删除其中的元素来修改 ArrayList。我怎样才能避免这种情况?
您可以从列表中创建一个不可修改的列表。 Collections class 有一个实用方法。
List<String> unModifiableList=Collections.unmodifiableList(
oldList);
在您的实际对象中准备好列表后,您可以将其冻结。
Unmodifiable List 是您必须采取的方法。但是有一个限制,因为这个不可修改的 class 正在采用一个通常的列表并且它仍然是可修改的。
final List<String> modifiable = new ArrayList<>();
modifiable.add("Java");
modifiable.add("is");
final List<String> unmodifiable = Collections.unmodifiableList(modifiable);
System.out.print("Before modification: " + unmodifiable);
modifiable.add("the");
modifiable.add("best");
System.out.print("After modification: " + unmodifiable);
在上面的代码段中,输出如下所示。
Before modification: [Java, is] After modification: [Java, is, the, best]
阅读 this article 以了解 unmodifiableList 的陷阱 及其解决方案。
您可以在 getter 方法中 return List 的新实例,并将您的列表作为构造函数参数。