web-dev-qa-db-fra.com

Enum statique vs. Enum non statique

Quelle est la différence entre les énumérations statiques et non statiques en Java? Les deux usages sont les mêmes.

Est-il correct que tous les statiques sont chargés dans la mémoire au démarrage, et les non statiques sont chargés à la demande? Si oui, alors quelle méthode est la meilleure? Conserver certaines données toujours en mémoire ou utiliser les ressources du serveur pour les charger à chaque fois?

public class Test {

    public enum Enum1 {
        A, B
    }

    public static enum Enum2 {
        C, D
    }

    public static void main(String[] args) {
        Enum1 a = Enum1.A;
        Enum1 b = Enum1.B;

        Enum2 c = Enum2.C;
        Enum2 d = Enum2.D;
    }
}
71
AHHP

Tous les enums sont effectivement static. Si vous avez une énumération imbriquée, cela ressemble beaucoup à un static class.

Toutes les classes sont paresseusement chargées (enums ou autres), mais quand elles sont chargées, elles sont chargées en même temps. c'est-à-dire que vous ne pouvez pas charger quelques constantes mais pas d'autres (sauf au milieu de l'initialisation de la classe)

Java permet à certains modificateurs d'être implicites pour éviter d'avoir à les déclarer tout le temps. Cela signifie que l'ajout d'un modificateur ne fait pas nécessairement autre chose que fournir un moyen plus long d'écrire la même chose.

Modificateurs par défaut pour

classe champ/méthode/classe imbriquée - package local, non final, non statique

enum et nested enum - package local, final et static

champ d'interface - public static final

méthode d'interface - public abstract

classe imbriquée dans une interface - public static, non final

Remarque: bien que static soit facultatif pour un enum, il est toujours statique. Cependant, final ne peut pas être défini pour une énumération même si elle est toujours théoriquement final (techniquement, vous pouvez avoir des sous-classes avec des implémentations surchargées pour les constantes).

EDIT: Le seul endroit où vous devez utiliser static avec enum est avec import static d'une valeur d'énum. Merci @ man910

133
Peter Lawrey

Si vous parlez d'énums imbriqués, ils sont implicitement static par défaut.

Selon le spécification de langage Java :

Les types énumérés imbriqués sont implicitement statiques. Il est permis de déclarer explicitement un type enum imbriqué comme étant statique.

18
Konstantin Yovkov

Tous les énumérations sont implicitement statiques, vous n'avez simplement pas besoin d'écrire le mot clé static. De la même manière que toutes les méthodes d'interface sont implicitement publiques.

11
Elliott Hill

Comme enums sont inherently static, il n’ya aucun besoin et ne fait aucune différence lorsqu’on utilise static-keyword dans enums.

Si une énumération est membre d'une classe, elle est implicitement statique.

Les interfaces peuvent contenir des déclarations de type membre. Une déclaration de type membre dans une interface est implicitement statique et publique.

Forum de la communauté Oracle et discussion à ce sujet

4
user3145373 ツ