Dai un'occhiata a questo java puzzles vid di Josh Bloch e William Pugh, intorno all'indice del tempo 0: 25: 00-0: 33: 00.Ho trovato un bug in Java Puzzlers VI - qualcuno può spiegarlo?
Uno degli oratori dice che se si utilizza minuscole boolean
invece di Boolean
, poi LIVING
saranno trattati come una vera e propria "compilazione costante di tempo", e non è più importante quando viene inizializzato.
Bene, questo è tutto bene e dandy, ma, dare un'occhiata a cosa succede quando si ripristina l'ordine originale tra l'init statico e il costruttore, e quindi seguirlo con una semplice operazione "Extract Method". Questi due programmi di stampa differenti uscite:
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
}
}
E con il refactoring returnTrue()
metodo
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
}
}
Perché non estrarre il metodo returnTrue() cambiare il programma di uscita in questo caso?
Stai dicendo che ci sono bug in un bug/video sui bug? Penso che sia chiamato ricorrenza e puoi ottenere stackoverflow (ma sei già su stackoverflow): | – IAdapter
+1 - Non conoscevo la risposta. Ho inoltrato a qualcuno che lo fa. – Kylar