2008-10-31 6 views
50

J'ai une interface - voici une version bien artificiel comme exemple:Définition de l'énumération Java imbriquée - la déclaration en tant que statique fait-elle une différence?

public interface Particle { 

    enum Charge { 
     POSITIVE, NEGATIVE 
    } 

    Charge getCharge(); 

    double getMass(); 

    etc... 
} 

Est-ce qu'il ya une différence dans la façon dont les mises en œuvre de ce réagiraient si je défini le Charge ENUM comme statique - à savoir ce que cela a un effet:

public interface Particle { 

    static enum Charge { 
     POSITIVE, NEGATIVE 
    } 

    Charge getCharge(); 

    double getMass(); 

    etc... 
} 

Répondre

78

Non, cela ne fait aucune différence. Cependant, la raison n'est pas parce que c'est une déclaration de membre à l'intérieur d'une interface, comme Jon dit. La vraie raison est selon les spécifications de la langue (8,9) qui

types emboîtés ENUM implicitement statique. Il est permis à de déclarer explicitement un type d'enum imbriqué pour être statique.

Au statique exemple suivant ne fait aucune différence soit (même si nous avons pas d'interface):

public class A { 
    enum E {A,B}; 
} 

public class A { 
    static enum E {A,B}; 
} 

Un autre exemple avec un imbriquée privé ENUM (pas implicitement public).

public class A { 
    private static enum E {A,B} 
} 
+2

Je dirais que c'est les deux - c'est implicitement statique pour deux raisons différentes, mais l'un ou l'autre aurait suffi à lui seul. –

30

Non, il ne fait aucune différence. De l'language spec, section 9.5:

Les interfaces peuvent contenir le type de membre déclarations (§8.5). Une déclaration de type membre dans une interface est implicitement static et public.

+0

Oui (+1) et en fait checkstyle marquerait le 'static' comme étant redondant et vous demanderait de le supprimer. Les variables dans les interfaces et les annotations sont automatiquement publiques, statiques et finales, de sorte que ces modificateurs sont également redondants. – VonC

Questions connexes