¿Alguien sabe por qué Java no le permite activar números mayores que los enteros? ¿Hay alguna razón técnica detrás de esto?Java y caja de conmutadores
Respuesta
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.
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 .
Esto es detalles de implementación. No es el motivo real de esta elección. – Gilles
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.
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
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.
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.
- 1. Mejor: caja de conmutadores o if-else?
- 2. C/C++ caja de conmutadores en matrices de caracteres
- 3. ¿Cómo usar una caja de conmutadores 'o' en PHP?
- 4. Java: ¿cómo inicializar la matriz int en una caja de conmutadores?
- 5. ¿Puedo usar instrucciones OR en conmutadores Java?
- 6. Eclipse: autocompletado de Java Enum de la caja del conmutador
- 7. Declaración e inicialización de variables dentro de los conmutadores Java
- 8. cajas de conmutadores Java: ¿con o sin llaves?
- 9. Alternativa a la caja del conmutador en Java
- 10. Cómo evitar si ... else y cajas de conmutadores
- 11. ¿Compilación de conmutadores entre .NET Framework compacto y completo?
- 12. Conversión eficiente entre vectores en caja y sin caja
- 13. Nueva caja Buscar y reemplazar
- 14. Primitivas en caja y equivalencia
- 15. Usando || en Cambio de caja en rieles
- 16. Seleccionar elementos de caja y: después de
- 17. Firefox: tamaño de caja y altura mínima
- 18. Caja de vagabundos compartida y automatizada
- 19. Insensibilidad de la caja de expresiones regex Java no funciona
- 20. AngularJS, enlace el alcance de una caja de interruptores?
- 21. ¿Cómo puedo invertir la caja de una cadena en Java?
- 22. Conmutadores de contexto no voluntarios: ¿cómo puedo prevenirlos?
- 23. la caja de autocompletar
- 24. CSS para gradiente de caja de sombra y las fronteras
- 25. Uso de representaciones de cadena de valores enum en la caja del conmutador
- 26. caja delimitadora de latitud y longitud para C#?
- 27. ggplot2: diagrama de caja con facet_grid y escala libre
- 28. Embalaje de caja con CSS
- 29. csslint - caja rota modelo
- 30. google caja cómo usar
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
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. –
Esa sería una razón bastante tonta, imagina tener algunas secuencias de bits largos que necesitas cambiar. – MightyPork