我只是想知道,基于给定的代码块,jvm中的对象初始化是否有任何不同。如果是这样的话,哪种方法是正确的?
enum FlagType {
NOT_DEFINED(0, null),
TEST(1, Constants.TEST),
PROD(5, Constants.PROD),
QA(8, Constants.QA);
private final Integer id;
private final String value;
private static final Map<Integer, FlagType> cacheValueById;
static {
Map<Integer, FlagType> valueById = Arrays.stream(FlagType.values())
.collect(Collectors.toMap(FlagType::getId,
Function.identity()));
cacheValueById = valueById;
}
}
enum FlagType {
NOT_DEFINED(0, null),
TEST(1, Constants.TEST),
PROD(5, Constants.PROD),
QA(8, Constants.QA);
private final Integer id;
private final String value;
private static final Map<Integer, FlagType> cacheValueById;
static {
cacheValueById = Arrays.stream(FlagType.values())
.collect(Collectors.toMap(FlagType::getId,
Function.identity()));
}
}发布于 2020-04-14 18:43:35
这并没有什么实际的区别,您只是用这个变量使代码变得更加冗长。
为变量赋值然后将变量赋值给字段与直接赋值给字段之间的区别与在返回变量之前赋值与仅仅返回值没有太大区别:变量并不会真正添加任何东西(除非您需要禁止显示警告或类似内容)。
事实上,它有损于代码,因为那里有更多的“东西”,比如变量类型和名称。这些对读者的理解有什么帮助吗?
在这种情况下,首先赋值给一个变量不会增加任何值,所以不要使用它。
也就是说,更好的方法是根本不使用静态初始化程序块。只要在字段声明上赋值即可。
private static final Map<Integer, FlagType> cacheValueById =
Arrays.stream(FlagType.values())
.collect(Collectors.toMap(FlagType::getId,
Function.identity()));发布于 2020-04-14 18:43:02
没有区别,在第一个例子中你只有一个中间的局部变量(顺便说一句,无用)。初始化块是线程安全的,因为它由类加载器线程调用。
https://stackoverflow.com/questions/61205735
复制相似问题