2008-10-31 8 views
50

tengo una interfaz - aquí está una versión muy bien ideada como un ejemplo:Definición enumerada del enum de Java: ¿declarar como estático hacer la diferencia?

public interface Particle { 

    enum Charge { 
     POSITIVE, NEGATIVE 
    } 

    Charge getCharge(); 

    double getMass(); 

    etc... 
} 

¿Hay alguna diferencia en la forma en implementaciones de esta se comportarían si se define la Charge enumeración como estática - es decir, tiene esto algún efecto:

public interface Particle { 

    static enum Charge { 
     POSITIVE, NEGATIVE 
    } 

    Charge getCharge(); 

    double getMass(); 

    etc... 
} 

Respuesta

78

No, no hace la diferencia. Sin embargo, la razón no es porque sea una declaración de miembro dentro de una interfaz, como dice Jon. La verdadera razón es de acuerdo a las especificaciones idioma (8,9 ) que

tipos de enumeración anidados son implícitamente estática. Está permitido declarar explícitamente que un tipo de enumeración enum es estático.

En el siguiente ejemplo estática no hace ninguna diferencia, ya sea (a pesar de que no tenemos ninguna interfaz):

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

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

Otro ejemplo con un anidado enumeración privada (no pública implícita).

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

Argumentaría que son ambas cosas: está implícitamente estática por dos razones diferentes, pero cualquiera de ellas habría sido suficiente por sí misma. –

30

No, no hace la diferencia. Desde el language spec, section 9.5:

Interfaces pueden contener tipo de miembro declaraciones (§8.5). Una declaración de tipo de miembro en una interfaz es implícitamente static y public.

+0

sí (1) y, de hecho Checkstyle haría bandera de la 'estática' como redundante y le pedirá que se retire. Las variables en las interfaces y las anotaciones son automáticamente públicas, estáticas y finales, por lo que estos modificadores también son redundantes. – VonC

Cuestiones relacionadas