Newsletter Java: Novedades de la Semana 3 Mayo 2025
Tu newsletter semanal de Programando En Java
👋 Hola, tribu Java, Ricardo reportándose para traerte las noticias más frescas del mundo del código.
Redes Sociales
📘 Facebook: Programando en JAVA
🐦 X (Twitter): ProgEnJava
📸 Instagram: Programando en Java
💼 LinkedIn: Ricardo Romero Benítez
▶️ YouTube: Programando en Java
🎵 TikTok: Programando en Java
🧵 Threads: Programando en Java
💬 Discord: Comunidad de Programando en JAVA
🎥 Video de la Semana en YouTube: Paquete JAVA.TIME 🕚
¿Sigues usando Date
y Calendar
en pleno 2025? Es hora de modernizar tu código. En el video de esta semana, exploramos el paquete java.time
, la solución moderna y elegante para trabajar con fechas y horas en Java. Aprende a usar LocalDate
, LocalTime
, ZonedDateTime
y más, con ejemplos prácticos y claros.
➡️ ¡No te lo pierdas y lleva tu manejo de fechas al siguiente nivel!
🔥 OpenJDK - JDK 25: La revolución de JDK 25 está en marcha
¡Atención, jedis del código! Dos JEPs que estaban en la cuerda floja han dado el salto de Proposed to Target a Targeted para JDK 25:
JEP 513 - Flexible Constructor Bodies: Por fin constructores más flexibles para que no te quedes atrapado en el pasado. Más info aquí.
JEP 505 - Structured Concurrency (Fifth Preview): Porque manejar concurrencia estructurada debería ser menos un dolor de cabeza y más un arte. Lee más aquí.
Pero espera, ¡hay más! Tres JEPs subieron de Candidate a Proposed to Target, apuntando fijo a JDK 25:
JEP 510 - Key Derivation Function API: Seguridad y criptografía en tus manos. Detalles aquí.
JEP 508 - Vector API (Tenth Incubator): Saca el máximo jugo a tu hardware con esta API mejorada. Más info aquí.
JEP 506 - Scoped Values: Variables scoped a otro nivel para el manejo de estado. Echa un vistazo aquí.
Revisa las discusiones finales que cierran a más tardar este viernes 16 de mayo: JEP 510, JEP 508, y JEP 506.
También, dos JEPs pasaron a Candidate para mejorar el rendimiento y estabilidad de la JVM:
JEP 518 - JFR Cooperative Sampling: Explica en qué momentos la JVM hace pausa para un muestreo más estable del stack. Detalles aquí: JEP 518.
JEP 516 - Ahead-of-Time Object Caching with Any GC: Startup ultra rápido con caching de objetos compatible con ¡cualquier recolector de basura! Checa más en: JEP 516.
Consulta la lista completa de las JEPs que definirán JDK 25 aquí. No te quedes atrás o sufrirás FOMO (Fear Of Missing Out).
Más detalles en el genial resumen de InfoQ 👉 JDK News Roundup.
🚀 JDK 25 Early Access Build 22 ya está aquí
Si eres de los osados que no esperan, ya puedes descargar el último build 22 de los early-access para JDK 25 con un montón de bugs corregidos y mejoras.
Cambios de build 21 a 22, temas arreglados y pulidos: Comparación aquí.
Detalles de la Release Notes que nadie lee, pero tú debes: JDK 25 Release Notes.
¿Encontraste bugs? No te hagas el muerto y mándalos directo al Java Bug Database antes de que sean leyenda urbana.
🧵 Java JDK 25: Structured Concurrency en modo Targeted
¡Olvida los enredos y los hilos locos!
En la nueva versión del JDK 25, la estructura de concurrency acaba de subir de nivel con JEP 505 (Structured Concurrency, Quinta Preview) alcanzando el estatus Targeted. Esto significa que el API tiene ya una forma mucho más estable y lista para empezar a usarse en serio.
¿Qué cambia en esta quinta ronda?
Adiós a los constructores públicos: Ahora no creas un
StructuredTaskScope
connew
. La magia está en el método estáticoStructuredTaskScope.open()
. Esto no es solo estilo: mejora la claridad, hace que el código se vea más limpio y deja la puerta abierta para que el equipo de OpenJDK le agregue más cosas sin romperte el código.¿Y eso qué pinta tiene?
try (var scope = StructuredTaskScope.open()) {
Subtask<String> user = scope.fork(() -> fetchUser(userId));
Subtask<List<Order>> orders = scope.fork(() -> fetchOrders(userId));
scope.join(); // Esperamos a que terminen
String userName = user.get();
List<Order> userOrders = orders.get();
}
Se aseguran tres elementos clave:
Vida útil controlada: Los subtareas solo existen dentro del scope padre (olvídate de hilos zombies).
Cancelación confiable: Si algo falla, el resto se cancela y no hay fugas de recursos.
Observabilidad top: Los hilos quedan jerarquizados, perfecto para debuggear como un pro.
Joiners a otro nivel
El API ahora te permite elegir cómo quieres “unir” (join) tus tareas concurrentes con diferentes políticas, por ejemplo:
Joiner.anySuccessfulResultOrThrow()
— Terminar cuando alguna tarea regresó bien, cancelando las demás.Joiner.allSuccessfulOrThrow()
— Esperar a que todas terminen y devolver todos los resultados o tirar una excepción.
try (var scope = StructuredTaskScope.open(Joiner.anySuccessfulResultOrThrow())) {
tasks.forEach(scope::fork);
return scope.join();
}
Puedes jugar con estas políticas o crear tus propias reglas implementando la interface Joiner<T,R>
.
Bonus para frikis:
Tus
ScopedValue
pasan a los subtareas como herencia clonada, así que la info contextual no se pierde en el salto.El dump de threads ahora incluye información jerárquica de estos scopes, útil para entender qué demonios está pasando en tus hilos.
Link oficial para los que quieren ver toda la jugada rica 👉 JEP 505 - Structured Concurrency (Fifth Preview)
🎓 ¿Ya conoces Java y quieres llevar tus habilidades al siguiente nivel?
He creado un Curso de Java Intermedio pensado para ti que ya dominas lo básico y quieres avanzar con conceptos como POO avanzada, colecciones, concurrencia, servlets, y más.
💡 Ideal si estás buscando mejorar tu perfil profesional o prepararte para proyectos reales
💻 Acceso de por vida + proyecto final que revisaré personalmente
🔝 Solo 12,99 €
💪 Al comprarlo, me ayudas directamente a seguir creando contenido gratuito en YouTube, newsletter y más.
Es una forma sencilla de apoyar mi trabajo y seguir aprendiendo.

¡Gracias por ser parte de esta comunidad de desarrolladores Java! 🙌
💾 JNoSQL 1.1.7: Mejoras en lectura y manejo de arrays + Instant
JNoSQL se actualiza con la versión 1.1.7 y trae:
Nuevos ValueReaders para soportar arrays y la clase Java Instant (sí, tus timestamps serán mejor manejados).
Mejoras en la clase ValueReaderDecorator para que leer datos sea la gloria.
Detalles en las release notes.
⚡ Quarkus 3.22.2: Este release salta bugs que ni sabías que tenías
La famosa JVM supersónica lanza la versión 3.22.2, con:
Mejor mensaje de error para cuando usas
@BeanParam
de Jakarta RESTful Web Services sin parámetros (porque nadie es perfecto).Fix para la generación de serializadores Jackson en Kotlin data classes. No más dramas con Kotlin.
Mira todo lo que arreglaron aquí: Release notes Quarkus.
📡 Hibernate Reactive 3.0.0 RC1: ¡La reactividad que tu app merece!
La primera release candidate de Hibernate Reactive versión 3 ya está aquí con:
Integración con JReleaser para facilitar las releases (porque el release manual es cosa del pasado).
Nuevas interfaces
Mutiny.QueryProducer
yStage.QueryProducer
para que programes con un SDK más limpio y potente.Nuevo método
getCriteriaBuilder()
en las interfacesMutiny
yStage
, alineado al estándar Jakarta Persistence. Bye-bye incompatibilidades.
Si eres fan de la programación reactiva, esto te va a encantar: Release notes.
💥 Construye tu Backend en Minutos, No en Semanas
¿Cansado de perder tiempo construyendo infraestructura? ¡Déjalo en mis manos! Con Spring Boot JWT Starter Pack podrás lanzar tu backend YA.
✅ Autenticación segura con JWT
✅ Gestión de roles sin dolor de cabeza
✅ API documentada y lista para producción
✅ Compilación nativa para rendimiento superior
🚀 Menos configuración. Más código que importa.

🌱 JHipster 8.11.0: JDK 24 y upgrades que traen alegría
JHipster no para y aterriza con la versión 8.11.0 que ya habla el idioma de JDK 24.
Upgrade de dependencias: Spring Boot 3.4.5, Gradle 8.14, y Node.js 22.15.0. Actualízate o quédate en pañales.
Mejoras en seguridad y ahora puedes fijar un User ID en el token JWT para controlar mejor quién molesta en tu sistema.
Más info en la release notes oficial.
⚙️ JobRunr 7.5.1: Bugs aplastados sin compasión
JobRunr viene con una actualización pequeña pero crucial:
Corrección del 404 causado por el manejo incorrecto del punto (
.
) en la query string enStaticFileHttpHandler
.Arreglo de crashes por
NullPointerException
cuando métricas vienen null.
Detalles aquí: JobRunr 7.5.1 Release.
🗃️ Infinispan 16.0.0 Dev: Ahora con OpenTelemetry y mejor marshalling
Primera developer release de Infinispan 16 viene con:
Soporte para la API incubator de OpenTelemetry, para que captures trazas sin despeinarte.
Método más simple
objectFromInputStream()
gracias al uso detransferTo()
en Java InputStream. Bye a los loops lentos.
¿Listo para probar? Aquí el release notes.
🎩 JBang 0.126.0: Modularizando el JDK a otro nivel
JBang actualiza y trae:
Código de gestión del JDK movido a un módulo separado (
dev.jbang.devkitman
). Esto mejora mantenimiento y escalabilidad.Varios fixes y mejoras de documentación para que no te quedes en el limbo.
Chécalo aquí: JBang 0.126.0 Release.
📊 Gatherers4j 0.11.0: Nuevos métodos para medias móviles exponenciales
Todd Ginsberg vuelve con más magia en su librería Gatherers4j, inspirada en JEP 485:
Añadidos métodos
exponentialMovingAverageWithAlpha()
,…By()
,…WithPeriod()
, y…WithPeriodBy()
para cálculos más sofisticados con streams.Mejoras en la clase
RotateGatherer
para manejar menos datos y hacerlo más rápido.
Disfruta las novedades en: Gatherers4j 0.11.0 Release.
🤩 ¡Tu opinión importa!
¡Ayúdame a mejorar esta newsletter!. Responde esta encuesta (menos de 1 minuto) para contarme qué temas prefieres y cómo puedo mejorarla.
🚀 Innovación Serverless: Adiós Clusters, Hola Object Storage
¿Qué demonios está pasando?
Alex Seaton, el staff software engineer de Man Group, nos ha dejado boquiabiertos con su presentación “How to Build a Database Without a Server” en el QCon London 2025. En resumen: el equipo de Man Group decidió que su monstruoso granero de MongoDB ya no les servía — demasiado mantenimiento, cascadas de versiones que hacen que rastrear modificaciones se vuelva un verdadero dolor de cabeza.
La solución épica:
Cambiar de un cluster de MongoDB voluminoso y fuera de control a una base de datos serverless montada en almacenamiento de objetos — sí, un sistema que usa una biblioteca de software llamada ArcticDB combinada con Python y C++ para acceder a almacenamiento de objetos.
👉 Puedes ver la conferencia completa y sacar ideas aquí en QCon London.
¿Cómo funciona esta brujería?
En vez de almacenar datos en clusters sobrecargados, usan un sistema que almacena datos como un árbol de objetos inmutables, donde sólo la capa superior es mutable. Esto significa menos mantenimiento, más escalabilidad automática y velocidades de lectura limitadas sólo por el ancho de banda del almacenamiento.
Pero ojo, procesar entre C++ (la base nativa de ArcticDB) y Python para hacer consultas puede ser un poco costoso — así que hay que cuidar ese cuello de botella.
💡 Consejo de la Semana: Spring Boot Actuator
¿Necesitas exponer fácilmente información del estado de tu aplicación?
🩺 Activa el Spring Boot Actuator para tener endpoints como /actuator/health
, /actuator/info
y más:
Añade la dependencia en tu
pom.xml
obuild.gradle
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Configura en
application.yml
:
management:
endpoints:
web:
exposure:
include: health, info
¡Ideal para monitorear tu app en producción o integrarla con herramientas como Prometheus o Grafana! 📈
📩 Si te ha gustado esta edición, compártela con otros desarrolladores y nos vemos la próxima semana con más novedades.
¡Feliz coding! 🚀
Ricardo