Jorge Turbica / blog · Blog ← Todos los artículos EN · Read in English
Lenguajes

Java retira Primitive Patterns tras cinco previews y lo borra de JDK 28

OpenJDK abandona los patrones con tipos primitivos por Valhalla: si los usas con --enable-preview, tu código no compilará en JDK 28.

Cinco previews, de JDK 23 a JDK 27, y la sexta no llegará. El 9 de noviembre de 2026, el equipo del proyecto Amber anunció que deja de desarrollar Primitive Types in Patterns, instanceof, and switch: el borrador de JEP que la iba a previsualizar por sexta vez se retira y la funcionalidad se elimina de JDK 28, también con --enable-preview. Retirar una preview es poco habitual, y la razón dice mucho de hacia dónde va el lenguaje.

Qué se pierde

La funcionalidad extendía el pattern matching a los tipos primitivos. Permitía escribir case int i when i >= 100 en un switch, usar instanceof con int o double, y descomponer un record con un tipo primitivo distinto al de su componente. El ejemplo de la propia JEP es un JsonNumber(double d): con la preview, instanceof JsonNumber(int a) solo encajaba si el double cabía en un int sin perder información. Sin ella, vuelves al cast manual, que puede truncar sin avisar.

Esa idea de conversión exacta era lo más valioso del diseño: el patrón distingue entre conversiones con pérdida y sin pérdida, y simplemente no encaja cuando habría pérdida.

VersiónJEPEstado
JDK 23JEP 455Primera preview
JDK 24JEP 488Segunda, sin cambios
JDK 25JEP 507Tercera, sin cambios
JDK 26JEP 530Cuarta, con exactitud y dominancia más estrictas
JDK 27JEP 532Quinta, sin cambios
JDK 28—Eliminada

Por qué se retira

No es que la funcionalidad no funcionara. El motivo es Valhalla: ese proyecto está explorando una nueva visión de los tipos numéricos en Java, incluida la posibilidad de que el usuario defina los suyos. Esos tipos nuevos tendrían que soportar la conversión exacta, y la conversión exacta tendría que contemplarlos a ellos. Con Valhalla todavía en evolución, el equipo considera prematuro cerrar la definición actual. Fijarla ahora habría sido atarse a una semántica que quizá no encaje con los números del futuro.

El proceso lo permite sin dramas: la JEP 12, que regula las previews, ya prevé que una pueda retirarse mediante una incidencia en el JBS, sin necesidad de una JEP nueva.

Qué viene en su lugar

Amber planea sustituirla por otra funcionalidad, Constant Patterns, que hereda parte del trabajo, como el soporte ampliado de primitivos en switch. Permitirá usar algunas constantes como patrones anidados dentro de un record, por ejemplo case Point(0, 0), lo que quitará cláusulas when de muchos switch. El borrador de su JEP se publicará en breve.

A quién afecta

A casi nadie en producción, porque las previews no deberían estar ahí. Pero sí a quien la haya probado en proyectos internos o en librerías que compilan con --enable-preview en cada versión: al pasar a JDK 28, ese código dejará de compilar. Si es tu caso, el arreglo es mecánico: los case int i vuelven a ser default y los patrones primitivos dentro de records vuelven a un cast con tu propia comprobación de rango.

java
// JDK 27 con --enable-preview
case int i when i >= 100 -> issueGoldCard();
case int i -> standardOffer(i);

// JDK 28: sin patrones primitivos
default -> flights >= 100 ? issueGoldCard() : standardOffer(flights);

La lección va más allá de esta funcionalidad: cinco previews no garantizan que algo llegue a ser estándar. Las previews existen justo para poder cambiar de idea, y Java acaba de usar esa puerta con algo que llevaba cinco versiones a la vista.

Fuentes

Jorge Turbica

Software Engineer y SRE. Escribo sobre los retos reales que me encuentro en producción.

Ver portfolio ↗