一、前言
static变量的初始化
类变量有点C语言的全局变量的味道,所以一般在单例或者真的只想维护一个全局变量的时候才会使用。
二、Java的Map初始化
介绍两种较为常用的初始化方式,
import java.util.HashMap;
import java.util.Map;
/**
* 初始化Map static field两种常用方式
*
* @since 2021-12-14-3:57 PM
*/
class MapTest {
/**
* 该初始化方式的返回一个unmodifiable map
*/
private static final Map<String, String> TEST_1 =
Map.ofEntries(
Map.entry("1", "A"),
Map.entry("2", "B")
// Map.entry(null, null) // 运行时空指针异常,不支持存放null key&&value
);
private static final Map<String, String> TEST_2 = new HashMap<>() {
{
put("1", "A");
put("2", "B");
}
};
public static void main(String[] args) {
// TEST_1.get(null); // 运行时空指针异常
TEST_2.get(null); // 正常运行
}
}
第一种方式需要jdk9才支持,避免出错其实还是推荐方式二,有很好的避免null调用的运行时异常。
方法二为一种匿名子类的方式,第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。
在Json序列化的时候,方法二会可能出现问题,因此使用static块初始化是一种较为稳妥的做法,
import java.util.HashMap;
import java.util.Map;
public class Test{
private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
static {
myMap.put(1, "one");
myMap.put(2, "two");
}