Dans le projet sur lequel je travaille, j'ai trouvé un code étrange:

public enum Service {
    ...
    private static final Service[] values = values();

    public static Service[] getValues() {return values;}
}

Avez-vous une idée de la raison pour laquelle l'implémenteur a ajouté sa méthode personnalisée au lieu d'utiliser la méthode values () partout? Je sais, la méthode values () est générée au moment de la compilation, cela affecte-t-il quelque chose?

1
awfun 23 déc. 2015 à 13:51

2 réponses

Meilleure réponse

C'est parce que le Enum.values() normal crée un nouveau tableau à chaque fois pour s'assurer que les résultats de l'appel sont toujours cohérents.

Ce code supprime cela et ne l'appelle qu'une seule fois. Cela peut être dû au fait que le codeur pensait que cela pouvait entraîner des fuites / écrasements de mémoire.

C'est une odeur de code car vous pourriez faire Service.getValues()[2] = xxx; et corrompre le tableau pour tous les utilisateurs.

4
OldCurmudgeon 23 déc. 2015 à 11:18

Je l'ai déjà fait une fois avec une classe car c'est le moyen le plus simple de résoudre ce problème:

  • vous avez une classe A, avec des méthodes et des données statiques (paramètres, ...)

  • vous voulez des sous-classes B1, B2, qui utilisent les mêmes méthodes (de B ou de A), avec ses propres paramètres ou paramètres de A (dépendent de B1, B2, ...)

Vous ne pouvez pas sous-classer les variables statiques, alors vous les obtenez par une méthode que vous pouvez sous-classer. Et par défaut, vous obtenez des paramètres statiques.

Ce n'est pas possible avec Enum (ne peut pas être étendu) , mais le codeur a peut-être voulu l'étendre. un article utile: Les énumérations peuvent-elles être sous-classées pour ajouter de nouveaux éléments?

0
Community 23 mai 2017 à 10:27