我只是想知道,基于给定的代码块,jvm中对象初始化是否有任何区别。如果是这样,哪种方法是正确的?
class Test {
private static final Map<Integer, CType> cacheValueById;
static {
Map<Integer, FlagType> valueById = Arrays.stream(FlagType.values())
.collect(Collectors.toMap(FlagType::getId,
Function.identity()));
cacheValueById = valueById;
}
}
class Test {
private static final Map<Integer, FlagType> cacheValueById;
static {
cacheValueById = Arrays.stream(FlagType.values())
.collect(Collectors.toMap(FlagType::getId,
Function.identity()));
}
}
没有实际区别,您只是使代码更难阅读。
正确的方法是不使用静态初始化程序块。只需在字段声明上分配即可。
private static final Map<Integer, FlagType> cacheValueById =
Arrays.stream(FlagType.values())
.collect(Collectors.toMap(FlagType::getId,
Function.identity()));
没有区别,在第一个示例中,您只是具有一个中间变量(顺便说一句无用)。初始化块是线程安全的,因为被类加载器线程调用。