版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/68927742
Java 中声明常量我们一般使用 final 关键字来修饰,但是 final 一般只对基本数据类型有效,比如:
public static final String content = "你好";
public static final int num = 1;
如果我们需要一个常量的List或者Map,单纯的使用 final 来修饰,对添加和修改集合的内容就没有作用了。下面的代码并不能达到我们的目的“集合内容常量化”。
public static final Map<String, String> myMap = new HashMap<String, String>() {
private static final long serialVersionUID = 1L;
{
put("1", "11");
put("2", "22");
}
};
public static final List<String> myList = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
add("a");
add("b");
}
};
具体原因有兴趣的可以去研究Java的内存地址存储,下面直接给出可以解决问题达到目的方法:
public static final Map<String, String> myMap = Collections.unmodifiableMap(new HashMap<String, String>() {
private static final long serialVersionUID = 1L;
{
put("1", "11");
put("2", "22");
}
});
public static final List<String> myList = Collections.unmodifiableList(new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
add("a");
add("b");
}
});
当然List 还有另外一种方法:
public static final List<String> myList1 = new ArrayList<String>(Arrays.asList("Tom", "Jerry", "Mike"));
最后多说一句,上面代码中的 final 虽然并不能对 Map、List 内容的修改起到实际作用,但是和String这种类型一样,可以禁止直接对map赋值。
被final修饰后,当我们的集合初始化以后,再进行直接对象赋值,像 myMap = new HashMap<String, String>();
这样,是无法通过编译的。
所以为达目的,我们既要禁止对象通过“直接赋值”的方式来修改,也要禁止集合内容的变更。