Je me demande simplement s'il y a une différence pour l'initialisation d'objet dans jvm, en fonction des blocs de code donnés. Si oui, quelle est la bonne façon de faire?

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()));
   }
}
0
FreeMan 14 avril 2020 à 13:38

2 réponses

Meilleure réponse

Il n'y a pas de différence pratique, vous rendez simplement le code plus détaillé avec la variable.

La différence entre attribuer une valeur à une variable et ensuite affecter la variable à un champ vs attribuer directement au champ n'est pas très différente de l'affectation à une variable avant de renvoyer cette variable, vs simplement renvoyer la valeur: la variable n'ajoute pas vraiment quoi que ce soit (sauf si, par exemple, vous devez supprimer un avertissement ou similaire).

En fait, cela nuit au code car il y a plus de "trucs" là-bas, comme le type et le nom de la variable. Cela ajoute-t-il quelque chose à la compréhension du lecteur?

Dans ce cas, l'assignation à une variable n'ajoute d'abord aucune valeur, donc ne l'utilisez pas.

Cela dit, l'approche préférable est de ne pas utiliser du tout un bloc d'initialisation statique. Attribuez simplement sur la déclaration de champ.

private static final Map<Integer, FlagType> cacheValueById = 
    Arrays.stream(FlagType.values())
        .collect(Collectors.toMap(FlagType::getId,
                Function.identity()));
1
Andy Turner 14 avril 2020 à 11:02

Aucune différence vous avez juste une variable locale intermédiaire dans le premier exemple (btw inutile). Le bloc Init est thread-safe car appelé par le thread du chargeur de classe.

0
CodeScale 14 avril 2020 à 10:43