问题
是否可以将一个数组封装,使数组内容具有不可变性?
分析
1.数组
在java中,数组是一种引用类型,用来存储固定大小的同类型元素。在内存中,数组对象存在栈中,而数组元素存储在堆中,当创建一个数组对象后,会在堆中开辟相应的内存区域,此时数组对象指向这块内存的存储地址。
2.不可变对象:
java中的不可变对象指的是:该对象被创建后,对象所有的状态和属性在其生命周期内不会改变。
3.final关键字:
在java中,对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
举例说明
final int[] nums= new int[] {5,2,6,23,54,3}; nums[0] = 55;
该情况成立,因为nums[0]修改的是数组元素,并没有修改nums数组对象本身的状态。但是若是以下情况,将不被允许: final int[] nums = new int[20]; nums = new int[10];
上述操作已经修改了nums数组对象本身的状态,是不允许的。
建议
如果一定要保护数组内容不被修改,建议使用容器类库使用一个不可修改的封装类来代替数组的使用,比如: List nums= Collections.unmodifiableList(Arrays.asList(5,2,234,23));
在unmodifiableList类的实现中,除了读操作以外,其他list的相关操作诸如add,remove,clear等操作都会抛出UnsupportedOperationException异常,以此保证list的不可修改性。