Historia del asunto
El pattern matching es una técnica tomada de lenguajes funcionales y de scripts que permite verificar el tipo y extraer datos en un solo paso. En Java, el desarrollo del pattern matching comenzó con Java 14 (característica de vista previa), mejoró en Java 16-17, y en las últimas versiones se está expandiendo a switch.
Problema
El método clásico de verificación de tipo y conversión era engorroso:
if (obj instanceof String) { String s = (String) obj; ... }
Aparecían variables innecesarias, una gran cantidad de código repetitivo y el riesgo de errores de conversión de tipos.
Solución
El pattern matching permite combinar la verificación de tipo, la declaración de una nueva variable y su uso en una sola expresión:
if (obj instanceof String s) { System.out.println(s.length()); }
Patrones similares ahora aparecen en la construcción switch, lo que hace que el código sea más conciso y menos propenso a errores.
Características clave:
¿Se puede usar el pattern matching para clases personalizadas o solo para tipos estándar?
Se puede usar para cualquier clase. El Pattern Matching funciona para todas las clases con las que se puede aplicar instanceof.
¿Estará la variable del patrón disponible fuera del bloque if/switch?
No, la variable declarada dentro del pattern matching solo es visible dentro del bloque donde fue creada (por ejemplo, dentro de if o caso switch).
Ejemplo de código:
if (obj instanceof Integer i) { // i es visible solo dentro de este bloque System.out.println(i + 10); } // Aquí i no está disponible
¿Se puede usar el pattern matching con genéricos?
Sí, de esta manera:
Object list = List.of("a", "b"); if (list instanceof List<?> l) { System.out.println(l.size()); }
Pero el trabajo con tipos crudos y la conversión a tipos parametrizados aún está limitado debido a la eliminación de tipos.
El equipo implementó el pattern matching en todos los casos, incluidos DTO internos, clases de servicio y casos donde era suficiente el polimorfismo. El código se volvió demasiado dependiente de instanceof, y la función de las jerarquías de clases se desdibujó.
Ventajas:
Desventajas:
En el proyecto, el pattern matching se aplicó solo a interfaces generales, utilidades auxiliares y el procesamiento de colecciones de tipo desconocido. La arquitectura OOP se mantuvo, utilizando el patrón solo donde era absolutamente necesario.
Ventajas:
Desventajas: