首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中静态代码块中字段初始化的正确方法

Java中静态代码块中字段初始化的正确方法
EN

Stack Overflow用户
提问于 2020-04-14 18:38:46
回答 2查看 45关注 0票数 0

我只是想知道,基于给定的代码块,jvm中的对象初始化是否有任何不同。如果是这样的话,哪种方法是正确的?

代码语言:javascript
复制
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()));
   }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-14 18:43:35

这并没有什么实际的区别,您只是用这个变量使代码变得更加冗长。

为变量赋值然后将变量赋值给字段与直接赋值给字段之间的区别与在返回变量之前赋值与仅仅返回值没有太大区别:变量并不会真正添加任何东西(除非您需要禁止显示警告或类似内容)。

事实上,它有损于代码,因为那里有更多的“东西”,比如变量类型和名称。这些对读者的理解有什么帮助吗?

在这种情况下,首先赋值给一个变量不会增加任何值,所以不要使用它。

也就是说,更好的方法是根本不使用静态初始化程序块。只要在字段声明上赋值即可。

代码语言:javascript
复制
private static final Map<Integer, FlagType> cacheValueById = 
    Arrays.stream(FlagType.values())
        .collect(Collectors.toMap(FlagType::getId,
                Function.identity()));
票数 1
EN

Stack Overflow用户

发布于 2020-04-14 18:43:02

没有区别,在第一个例子中你只有一个中间的局部变量(顺便说一句,无用)。初始化块是线程安全的,因为它由类加载器线程调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61205735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档