2008-11-21 12 views

Respuesta

-7

Tal vez porque es una programación realmente mala tener mayúsculas máximas en un interruptor?

Si desea cambiar las variables largas, simplemente projetelos en el espacio interger.

+0

Por favor, no votes esta respuesta! Explica * por qué * los diseñadores de lenguaje Java pensaron que era razonable limitar la instrucción switch a tipos de 32 bits. – palm3D

+3

Esto no es una razón, es especulación. Proyectar un largo en el espacio entero también derrota el propósito de usar un largo. –

+0

Esa sería una razón bastante tonta, imagina tener algunas secuencias de bits largos que necesitas cambiar. – MightyPork

23

Como dijo here, el interruptor funciona con los tipos de datos primitivos byte, short, char, e int. También funciona con tipos enumerados y algunas clases especiales que "envuelven" ciertos tipos primitivos: Carácter, Byte, Corto e Integer.

La instrucción de cambio de Java se compila en el JVM bytecode tableswitch or lookupswitch. Ambos códigos de bytes requieren que los valores de caso sean únicos, de 32 bits, enteros, constantes de tiempo de compilación.

Las instrucciones del conmutador de tabla y del conmutador de búsqueda incluyen un desplazamiento de bifurcación predeterminado y un conjunto de longitud variable de pares de valores de caso/bifurcación de bifurcación.
Ambas instrucciones muestran la clave (el valor de la expresión entre paréntesis inmediatamente después de la palabra clave de cambio) de la pila.
La clave se compara con todos los valores de caso:

  • Si se encuentra una coincidencia, la rama corrector asociado se toma el valor del caso.
  • Si no se encuentra ninguna coincidencia, se toma el desplazamiento de bifurcación predeterminado.

A pesar de lo anterior representa los detalles de implementación, creo los tipos utilizados para el interruptor son el uno compatible con un código de bytes eficiente para el control de flujo, y puede haber sido una parte importante de la razón de esta elección.

Como se ha dicho en este Java Bug:

supongo que se podría permitir que los casos sentencia switch de Java para incluir otros tipos de valores, y compilar una sentencia switch que utiliza uno de esos tipos de valores en otro código de bytes, tales como una secuencia de ifs y gotos. Pero luego tendríamos que examinar cuidadosamente todas las instrucciones de cambio para determinar si se compilará en un bytecode de cambio rápido o una secuencia lenta de if-elses.

Como se ha dicho en esta otra

'interruptor' Java bug declaraciones pueden usar función de despacho-mesa y/o búsqueda binaria de árboles para que coincida con las declaraciones de casos más rápido que sólo les probando uno por uno en orden .

+3

Esto es detalles de implementación. No es el motivo real de esta elección. – Gilles

0

Supongo que ese valor se eliminó como un tipo de expresión de conmutador válido debido a/relacionado con el hecho de que las operaciones en variables largas may not be atomic.

+0

No creo que ese sea el motivo. Si ese es el caso, entonces, si no, también debería haber sido restringido ¿no? Creo que tiene que hacer algo con los modos de direccionamiento de un procesador como señaló VonC (Porque el conmutador no se compila en el mismo código de bytes como si fuera otra estructura). – Abhi

1

Scala, un lenguaje construido sobre JVM, le permite definir sus propias clases de casos, que puede usar en una declaración de cambio. Entonces, usar longs o dobles o Strings en una declaración switch es ciertamente posible.

No sé, sin embargo, qué tan complicado y qué tan efectivo es. Con tipos simples, el compilador simplemente calcula una compensación para saltar sobre una tabla.Este definitivamente no es el caso con tipos más complejos.

Supongo que la respuesta tiene que ver con el momento en que se diseñó Java y los objetivos que los diseñadores estaban tratando de lograr. Los objetivos iniciales de Java eran diseñar un "mejor C++", portátil en muchos entornos. Puedo entender por qué un interruptor en tipos complejos no encajaba en él.

0

Si encuentra que la construcción del conmutador java nativo es demasiado limitante, eche un vistazo al lambdaj Switcher que permite activar declarativamente cualquier objeto al hacer coincidirlos con algunos matchers de Hamcrest.

Cuestiones relacionadas