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

问题描述 投票:0回答:1

我只是想知道,基于给定的代码块,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()));
   }
}
java java-8 java-9 java-11 java-10
1个回答
1
投票

没有实际区别,您只是使代码更难阅读。

正确的方法是不使用静态初始化程序块。只需在字段声明上分配即可。

private static final Map<Integer, FlagType> cacheValueById = 
    Arrays.stream(FlagType.values())
        .collect(Collectors.toMap(FlagType::getId,
                Function.identity()));

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.