在Java中定义我自己的不可变数组

在Java中定义我自己的不可变数组,java,arrays,immutability,Java,Arrays,Immutability,我知道声明数组final并不能使其不可变 但是,我可以定义一个包装类,它的功能类似于不可变数组,例如 public class ImmutableIntArray { private int[] array; public ImmutableIntArray(int[] array) { this.array = (int []) array.clone(); } public int get(int i) { return a

我知道声明数组
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));
    }
}
公共类不可变数组{
私有int[]数组;
公共不可变数组(int[]数组){
this.array=(int[])array.clone();
}
公共整数获取(整数i){
返回数组[i];
}
公共整数长度(){
返回数组长度;
}
公共静态void main(字符串[]args){
ImmutableIntArray a=新的ImmutableIntArray(新的int[]{1,2,3});
对于(int i=0;i
这种方法对我来说似乎很优雅,然而,它似乎是一种非常明显的方法,我很惊讶我没有看到其他人应用它。例如,为什么这不应该是某个地方标准库的一部分?我是否在这个定义上犯了错误,以至于我的类实际上是可变的

我相信同样的方法也适用于任何不可变的
对象
,我甚至可以使用泛型来定义它,即
不可变数组
类。 您可以使用


可能是因为人们使用列表;)您只是在删除阵列中的一些“特权”,无法向阵列中添加某些内容。在我看来,您只是向用户屏蔽了一些特性,但在底层仍然存在一个可变对象。也许我错了。伊戈尔,
List
s是不可变的吗?(这只是一个问题,因为我不知道)您的方法被充分使用了,这是您以前没有看到的额外方法。常规列表,如ArrayList是可变的。但是调用Collections.unmodifiableList(myListInstance)与调用类的操作相同。它返回一个列表(它实现了接口),在该列表中,mutators抛出unsupportedOperationException。这也是你的方法。好的设计。
Collections.unmodifiableList(Arrays.asList(yourArray));