【发布时间】:2013-09-13 23:53:35
【问题描述】:
我知道声明一个数组 final 并不能使它不可变。
但是,我可以定义一个像不可变数组一样工作的包装类,例如
public class ImmutableIntArray {
private int[] array;
public ImmutableIntArray(int[] array) {
this.array = (int []) array.clone();
}
public int get(int i) {
return array[i];
}
public int length() {
return array.length;
}
public static void main(String[] args) {
ImmutableIntArray a = new ImmutableIntArray(new int[]{1, 2, 3});
for (int i = 0; i < a.length(); ++i)
System.out.println(a.get(i));
}
}
这种方法对我来说似乎很优雅,但是,它似乎是一种非常明显的方法,我很惊讶我还没有看到其他人应用它。为什么这不应该是某个地方标准库的一部分?我是否对这个定义有任何错误,所以我的类实际上是可变的?
我相信相同的方法适用于任何不可变的Object,我什至可以使用泛型来定义它,即ImmutableArray<T> 类。
【问题讨论】:
-
可能是因为人们使用 List ;)
-
您只是在为您的阵列删除一些“特权”,您不能向阵列添加一些东西。在我看来,您只是阻止了用户的一些功能,但在基础上仍然有一个可变对象。也许我错了。
-
伊戈尔,
Lists 是不可变的吗? (只是一个问题,因为我不知道) -
你的方法被彻底使用了,是你以前没有见过的额外方法。
-
普通列表,例如 ArrayList 是可变的。但是调用 Collections.unmodifiableList(myListInstance) 与您的课程相同。它返回一个 List(它实现了接口),其中 mutators 抛出 unsupportedOperationException。与您的方法相同。不错的设计。
标签: java arrays immutability