Tema representativo de entrevista

Entrevista de Java: ¿Qué cambió con los Flexible Constructor Bodies de Java 25?

CodingDifícil
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Explica qué permite Java 25 Flexible Constructor Bodies antes de super() o this(), y qué accesos continúan siendo ilegales.

Pregunta y escenario

Java 25 finaliza los Flexible Constructor Bodies (JEP 513). Explica qué se puede ejecutar antes de un super(...) o this(...) explícito, por qué no se puede leer el objeto en construcción y cómo afecta esta característica a la herencia y al preprocesamiento de argumentos.

Qué está evaluando el entrevistador

  • Comprensión de las cadenas de constructores y la regla de seguridad de que la instancia aún no está inicializada.
  • Distinción entre la lógica estática o local permitida y el acceso ilegal a this.
  • Reconocimiento de versiones preliminares (preview) frente a versiones finales y el riesgo de migración de source/target.

Preguntas de aclaración antes de responder

Aclara si el objetivo es la característica final de JDK 25 o una versión preliminar anterior de JEP 447/482/492, además de las versiones de source, target y runtime del proyecto. Aclara si el enfoque está en la sintaxis, la verificación de la JVM o la incorporación en línea (inlining) de un helper que prepara los argumentos de super(...).

Estructura de respuesta de 30 segundos

El Java tradicional requiere que la primera sentencia del constructor sea super(...) o this(...). Los Flexible Constructor Bodies permiten un prólogo restringido antes de esa invocación, como calcular variables locales o inicializar campos de la clase actual, pero el código no puede leer ni invocar la instancia en construcción ni pasar un this no inicializado a código arbitrario. Esto permite el preprocesamiento directo de argumentos mientras se preserva el orden seguro de construcción de la superclase.

Respuesta detallada paso a paso

  1. Un constructor tiene un prólogo, una invocación explícita de constructor y el resto del cuerpo. this(...) continúa la cadena de la clase actual; super(...) entra a la clase padre.
  2. El prólogo puede declarar variables locales, evaluar expresiones independientes del estado de la instancia e inicializar campos de la clase actual que aún no estén inicializados. Esos valores pueden alimentar los argumentos del constructor.
  3. No puede leer campos de instancia, llamar a métodos de instancia, usar this como argumento ni exponer un objeto parcialmente inicializado a código observable.
  4. El compilador y la JVM rastrean qué campos permanecen sin inicializar para que el constructor de una superclase no pueda observar un orden de inicialización inválido. Los métodos estáticos y las constantes se pueden utilizar donde las reglas lo permitan.
  5. Durante la migración, elimina un helper solo cuando existía únicamente para preparar los argumentos de super(...); conserva los helpers con efectos secundarios, múltiples invocadores o valor de prueba independiente.
  6. Compila y ejecuta con el toolchain de JDK 25. Un proyecto que apunta a un source/target anterior no puede simplemente adoptar la sintaxis.
java
class Child extends Parent {
    private final String normalized;

    Child(String raw) {
        var value = raw.trim();       // prologue: local computation
        super(value);                 // explicit constructor invocation
        this.normalized = value;
    }
}

Ejemplo de respuesta de alta calidad

JEP 513 permite un prólogo restringido antes de super(...) o this(...). Es útil para el preprocesamiento de argumentos y la inicialización de campos de la clase actual que no dependan del estado de la instancia, pero sigue prohibiendo leer campos, llamar a métodos de instancia o exponer un this no inicializado. El compilador y la JVM preservan la garantía de que la superclase solo vea un estado de inicialización legal. Yo distinguiría las versiones preliminares de JEP 447/482/492 de la característica final de JDK 25 y verificaría las versiones de source, target y runtime. La característica reduce los helpers estáticos de un solo uso sin eliminar las restricciones de orden de constructores ni de seguridad en la herencia.

Errores comunes

  • Decir que cualquier sentencia puede aparecer antes de super().
  • Ignorar que this no está inicializado y permitir lecturas o llamadas de instancia.
  • Nombrar el número de un JEP de preview como el número final de JDK 25.
  • Editar el código fuente sin verificar el target del compilador y el runtime de despliegue.
  • Agregar efectos secundarios observables externamente al prólogo solo para dar un ejemplo conveniente.

Preguntas de seguimiento y respuestas

¿Por qué permitir el cómputo local pero no leer this?

El cómputo local no puede observar un objeto parcialmente inicializado. Las lecturas de campos o llamadas a métodos pueden activar el despacho dinámico (dynamic dispatch), exponer un estado incompleto o permitir que la lógica de la superclase vea invariantes rotos.

¿Son idénticas las reglas antes de this(...) y super(...)?

Ambas están restringidas por el contexto de construcción temprana (early-construction context). this(...) continúa la cadena de la clase actual y super(...) entra a la clase padre, pero ninguna puede exponer el estado de la instancia antes de la inicialización legal.

¿Cuándo deberías conservar el helper antiguo en lugar de incorporarlo en línea?

Consérvalo cuando tenga múltiples invocadores, efectos secundarios significativos, valor de prueba independiente o un límite de módulo claro. La característica es una capacidad del lenguaje, no un mandato de refactorización.

¿Cómo das soporte a versiones anteriores de JDK?

Un source/target más antiguo no puede usar la nueva sintaxis. Mantén el enfoque existente de preparación de argumentos hasta que el compilador, el runtime y la matriz de versiones se actualicen en conjunto.

Fuentes públicas

Preguntas relacionadas

Herramienta de entrevista relacionada

Usa Captura para un ejercicio de código

Captura el problema y luego aborda en orden las restricciones, la solución, el código, los casos extremos y la complejidad.

Ver la herramienta