Clases selladas de Java y coincidencia de patrones exhaustiva
Las nuevas clases selladas y funciones de coincidencia de patrones de Java están provocando debate sobre hasta qué punto el lenguaje debe avanzar hacia tipos de datos algebraicos y `switch` exhaustivos, y qué implica eso para la compatibilidad binaria a largo plazo. Los comentaristas contrastan la evolución lenta, conservadora y centrada en el runtime de Java con sus pares JVM más ricos en funciones como Kotlin y Scala, discutiendo si Java está “alcanzando” a otros lenguajes o manteniéndose deliberadamente más pequeño y estable. El hilo también plantea preocupaciones de diseño concretas —como cómo interactúan las jerarquías selladas con la evolución de bibliotecas, la ausencia de seguridad frente a nulos e interpolación de cadenas, y las compensaciones entre seguridad, legibilidad y extensibilidad futura.
Clases selladas, coincidencia de patrones y compatibilidad binaria
- La discusión se centra en las clases selladas de Java, la coincidencia de patrones y cómo interactúan con APIs en evolución.
- Ejemplo: la API de codificaciones PEM de JDK expuso inicialmente una clase sellada cuyos subtipos permitidos podían ampliarse en versiones posteriores de JDK, lo que arriesgaba
MatchExceptionen el código cliente que dependía deswitchexhaustivos. - Una revisión posterior de JDK añade un subtipo permitido no público para que el código externo no pueda ser exhaustivo de forma total sobre todas las variantes, evitando ese riesgo.
- Algunos ven esto como un truco elegante y conocido, similar a las anotaciones de “no exhaustivo” de otros lenguajes; otros creen que la necesidad de estos apaños revela fallos en el diseño.
- Debate sobre si añadir nuevos subtipos debería considerarse un cambio incompatible a nivel binario, de modo que los clientes deban recompilar, frente a aceptar fallos en tiempo de ejecución como ocurre con otros errores de enlace.
Exhaustividad frente a preparación para el futuro
- Un bando sostiene que los
switchexhaustivos sin una rama de respaldo son frágiles; todoswitchsobre jerarquías selladas debería tener una ramadefaulto de fallback para compatibilidad futura. - Otros responden que eso socava la principal ventaja de los tipos de datos al estilo algebraico y la comprobación de exhaustividad; quieren certeza en tiempo de compilación y un fallo ruidoso si las APIs cambian.
- Compromiso propuesto: una sintaxis o palabra clave distinta para “fallback pero seguir exigiendo exhaustividad actual”, con el fin de obtener seguridad ahora y compatibilidad futura después.
Estrategia de evolución del lenguaje en Java
- Muchos comentarios contrastan la adopción lenta y conservadora de funciones en Java con lenguajes de evolución más rápida.
- Algunos defienden Java como un “seguidor tardío” deliberado que toma ideas ya probadas (a menudo de lenguajes de la familia ML), pero mantiene el lenguaje relativamente pequeño y estable, concentrando la innovación en el runtime (GC, JIT, telemetría).
- Otros se quejan de que el ritmo de Java parece “glacial”, a menudo siguiendo a Kotlin, Scala o C# años después, y señalan funciones ausentes o retrasadas: interpolación de cadenas, tipos de nulabilidad, coincidencia de patrones más rica, azúcar sintáctico.
- Hay desacuerdo sobre si Java está “alcanzando” a Kotlin/C#, o simplemente persigue su propia estrategia más minimalista mientras esos lenguajes experimentan con más agresividad.
Comparaciones con Kotlin, Scala y otros
- Kotlin: elogiado por la seguridad frente a nulos, el smart casting y la ergonomía para el desarrollador; criticado por ser grande, lleno de “footguns” y profundamente ligado al ecosistema JVM.
- Scala: admirado por su expresividad y funciones avanzadas, pero visto como difícil de leer, fragmentado en estilo y lastrado por herramientas y tiempos de compilación.
- Algunos argumentan que las clases selladas y la coincidencia de patrones moderna son esencialmente características de Scala/C#/ML llegando en “sintaxis Java”; otros subrayan que Java equilibra deliberadamente potencia con legibilidad y mantenibilidad amplia.