0
点赞
收藏
分享

微信扫一扫

Java中常量Map、常量List

J简文 2022-02-25 阅读 82


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>();​​ 这样,是无法通过编译的。

所以为达目的,我们既要禁止对象通过“直接赋值”的方式来修改,也要禁止集合内容的变更。



举报

相关推荐

0 条评论