类中成员和方法的可见性一直是JAVA程序员必须时刻关注的问题。常量我们通常都会使用final去修饰,在给final常量赋值的时候,IDE会有很明显的报错。但是我们对于常量数组(集合)一般也会这样,例如public static final String[] STR_LIST = {"a", "b"},我们一般都会认为这种写法没有太大的问题,但是如果运行如下代码:
public class TestList {
public static final String[] STR_LIST = {"a", "b"};
public static void main(String[] args) {
System.out.println(Arrays.toString(STR_LIST));
STR_LIST[1] = "c";
System.out.println(Arrays.toString(STR_LIST));
}
}
你会发现我们认为的常量数组很轻易的被改变了。
这时候我们就可以用到Collections.unmodifiableList来实现List的不能修改。测试代码如下:
public class TestList {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
System.out.println(list);
list.add("c");
System.out.println(list);
List<String> list2 = Collections.unmodifiableList(list);
System.out.println(list2);
list2.add("d");
System.out.println(list2);
}
}
list2.add的时候会抛出UnsupportedOperationException,这样可以有效的提醒使用者此list无法被操作。
建议使用如下的方式对外暴露常量数组(集合)
public static final List OBJECTS_LIST = Collections.unmodifiableList(list);