2009-06-08 10 views
9

que tienen una sentencia switch en Java, en una enumeración, que vamos a llamar a IMyInterface.MyEnumEn las sentencias de cambio de Java en las enumeraciones, ¿por qué recibo un error de compilación cuando califico mis valores en cada caso?

Cada uno de mis declaraciones de caso tiene la forma: IMyInterface.MyEnum.MyValue, (aunque podría caer el IMyInterface si Importé)

Sin embargo, el compilador (Java 6) arroja un error: "La etiqueta de caso calificada IMyInterface.MyEnum.MyValue debe reemplazarse con la constante de enumeración sin enumerar MyValue".

Obviamente puedo hacer eso, pero por mi vida no entiendo cuál es el propósito de este error. Claramente, si el compilador puede manejar el valor real, debería ser capaz de tratar con el nombre completo como lo haría con las constantes. De hecho, habría supuesto que el compilador convierte la constante en el nombre completo.

Entonces, gurús de Java, ¿cuál es la razón detrás de esto? ¡Gracias!

+1

Personalmente, no me importa que las enumeraciones no puedan calificarse en bloques de cajas de interruptores; hace que el código sea más legible. Tenga en cuenta que para las clases enum que posee (en el código que puede editar), la mejor práctica es nunca utilizar un bloque de caja de conmutadores. Los métodos específicos de constante de Enum son más fáciles de mantener y menos frágiles que Switch-case en esta situación. – scottb

Respuesta

18

Desde el JLS:

(One reason for requiring inlining of constants is that switch statements require constants on each case, and no two such constant values may be the same. The compiler checks for duplicate constant values in a switch statement at compile time; the class file format does not do symbolic linkage of case values.)

Se puede encontrar here.

+1

¿Cómo encontraste ese bit? +1 para encontrar una aguja en un pajar. –

+0

lol Recordé haber leído algo sobre esto una vez ... Afortunadamente tengo el JLS PDF en mi escritorio solo para este tipo de ocasiones;) – laginimaineb

+0

Lo he marcado como favorito (así que todo lo que tengo que hacer es abrir una nueva pestaña y escribir JLS) , pero todavía no pude encontrar nada relevante. Supongo que no pensé en la compatibilidad binaria como una posible razón. –

3

Esa es una extraña. Tuve que investigar un poco para descubrir esto. Parece que es más seguro marcar el objeto que se está encendiendo que el nombre completo.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6191812 se generó un informe de error para permitirle especificar enumeraciones calificadas pero se cerró y no se activó por las razones que puede ver en el gabinete.

Cuestiones relacionadas