Eche un vistazo a este java puzzles vid de Josh Bloch y William Pugh, en el índice de tiempo 0: 25: 00-0: 33: 00.Encontré un error en Java Puzzlers VI. ¿Alguien puede explicarlo?
Uno de los altavoces dice que si se utiliza minúsculas boolean
en lugar de Boolean
, entonces LIVING
será tratado como un verdadero "tiempo de compilación constante", y ya no importa cuando se inicializa.
Bueno, todo esto está muy bien, pero echa un vistazo a lo que sucede cuando vuelves al orden original entre el init estático y el constructor, y luego lo sigues por una simple operación "Extraer método". Estos dos programas se imprimen diferentes salidas:
public class Elvis {
private static final Elvis ELVIS = new Elvis();
private Elvis() {}
private static final boolean LIVING = true;
private final boolean alive = LIVING;
private final boolean lives() {return alive;}
public static void main(String[] args) {
System.out.println(ELVIS.lives()); // prints true
}
}
Y con la refactorizado returnTrue()
método
public class Elvis {
private static final Elvis ELVIS = new Elvis();
private Elvis() {}
private static final boolean LIVING = returnTrue();
private static boolean returnTrue() {
return true;
}
private final boolean alive = LIVING;
private final boolean lives() {return alive;}
public static void main(String[] args) {
System.out.println(ELVIS.lives()); // prints false
}
}
¿Por qué el método de extracción returnTrue() cambia la salida del programa en este caso?
¿Estás diciendo que hay errores en un error/video sobre errores? creo que se llama recurrencia y puedes obtener stackoverflow (pero ya estás en stackoverflow): | – IAdapter
+1 - No sabía la respuesta. Me reenvió a alguien que lo hace. – Kylar