2012-03-27 20 views
18
public interface Proposal { 
    public static final enum STATUS { 
     NEW , 
     START , 
     CONTINUE , 
     SENTTOCLIENT 
    }; 
} 

Java no permite una enumeración sea final dentro de una interfaz, pero por defecto, todos los miembros de datos dentro de una interfaz es public static final. ¿Alguien puede aclarar esto?¿Por qué una enum de Java no puede ser definitiva?

+0

¿Es que piensas que una enumeración "no final" es de alguna manera subclassable? –

+0

no sabía que enum no puede ser subclase pero java nos da libertad para escribir el final de cualquier constante en la interfaz pero no enfrente de enum por qué esto parcialmente es lo que estaba preguntando (solo tratando de leer lo que hay en su mente mientras hacen esto?) –

+0

hay una enorme diferencia entre cómo se usa 'final' entre las definiciones de clase/interfaz (y, en principio, enum) y las de campo * de miembro * (que es lo que las "constantes" normalmente se encuentran en una interfaz). Uno afecta la subclasabilidad, y el otro afecta la mutabilidad. –

Respuesta

21

Una enumeración no puede ser definitiva, porque el compilador generará subclases para cada entrada de enumeración para la que el programador haya definido explícitamente una implementación.

Además, una enumeración donde ninguna instancia tiene su propio cuerpo de clase es implícitamente final, por JLS section 8.9.

25

Java no permite crear una clase que amplíe un tipo enum. Por lo tanto, las enumeraciones son siempre finales, por lo que usar la palabra clave final es superfluo.

Por supuesto, en cierto sentido, enum s no son definitivas porque puede definir una subclase anónima para cada campo dentro del descriptor de enumeración. Pero no tendría mucho sentido utilizar la palabra clave final para evitar esos tipos de descripciones, ya que las personas tendrían que crear estas subclases dentro del mismo archivo .java, y cualquiera con derechos para hacerlo podría quitar fácilmente la palabra clave final . No hay riesgo de que alguien extienda su enumeración en otro paquete.

+0

Respuesta completamente confusa. Si observa el origen de la clase java.lang.Enum, puede ver que no es final sino una clase abstracta. –

+2

Sin embargo, no se puede subclasificar el tipo 'enum'. –

+5

@EugeneKuleshov: la clase 'Enum' es abstracta porque tienes que poder ampliarla. Pero los 'enum's reales que lo extienden son definidos por el compilador como clases' final'. Consulte http://mindprod.com/jgloss/enum.html#UNDERTHEHOOD1 – StriplingWarrior

6

Dos cosas:

  1. enumeraciones son subclases finales de java.lang.Enum
  2. si una enumeración es un miembro de una clase, es implícitamente estática
2

No tiene sentido declarar enum final. Final para las clases significa que no se pueden heredar. Sin embargo, las enumeraciones no se pueden heredar de manera predeterminada (es decir, son definitivas).

La última cosa es válida solo para las variables. Sin embargo, debería pensar en las enumeraciones más como tipos de datos que como variables.

Cuestiones relacionadas