28 votes

Enum et variable statique dans le constructeur

L'accès aux champs statiques en enum constructeur est interdit par le compilateur. Le code source ci-dessous fonctionne, il utilise un champ statique:

public enum TrickyEnum
{
    TrickyEnum1, TrickyEnum2;

    static int count;

    TrickyEnum()
    {
        incrementCount();
    }

    private static void incrementCount()
    {
        count++;
    }

    public static void main(String... args)
    {
        System.out.println("Count: " + count);
    }
}

Sortie:

Count: 2.

Mais le code ci-dessous ne fonctionne pas malgré il y a très peu de différence:

public enum TrickyEnum
{
    TrickyEnum1, TrickyEnum2;

    static int count;

    TrickyEnum()
    {
        count++; //compiler error
    }

    public static void main(String... args)
    {
        System.out.println("Count: " + count);
    }
}

De ma recherche, généralement les gens prétendent que le problème est dû à l'ordre dans lequel les champs statiques sont initialisés. Mais d'abord, exemple fonctionne, alors pourquoi ne développeurs Java interdire le deuxième exemple? Il convient également de travailler.

23voto

dasblinkenlight Points 264350

Le compilateur permet un appel à une fonction statique, car il n'est pas assez intelligent pour l'interdire: la légitimité de l'appel ne peut pas être déduite sans regarder dans le corps de l' incrementCount méthode.

La raison de ce qui est interdit devient clair lorsque vous exécutez le code suivant:

enum TrickyEnum
{
    TrickyEnum1, TrickyEnum2;

    static int count = 123; // Added an initial value

    TrickyEnum()
    {
        incrementCount();
    }

    private static void incrementCount()
    {
        count++;
        System.out.println("Count: " + count);
    }

    public static void showCount()
    {
        System.out.println("Count: " + count);
    }
}

public static void main (String[] args) throws java.lang.Exception
{
    TrickyEnum te = TrickyEnum.TrickyEnum1;
    TrickyEnum.showCount();
}

Cette affiche

1
2
123

ce qui est très déroutant pour un programmeur lecture de votre code: essentiellement, incrementCount n'ses modifications du champ statique avant il a été initialisé.

Voici une démo de ce code sur ideone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X