La regola principale è che se il compilatore può dedurre il valore esatto dal codice sorgente che ha nella singola classe. Perché fa tutte le ottimizzazioni usando solo la più piccola unità di compilazione - classe. Se scrivo un codice
public class Test
{
private static final String i = "1";
public static void main(String[] args)
{
if(i == "2")
System.out.println("hello");
System.out.println("world");
}
}
Il compilatore vede tutto il codice relativo alla dichiarazione in questa classe e ottimizza la se la condizione. Dopo de-compilatore del codice è simile
public class Test
{
private static final String i = "1";
public static void main(String[] paramArrayOfString)
{
System.out.println("world");
}
}
(ho usato jd-gui)
Tuttavia, se si sostituisce ==
dal .equals
, compilatore non può assumere come il metodo .equals
funziona.Perché, dopo la compilazione della classe Test
, è possibile modificare il JDK e inserire un'altra versione della classe che restituisce true
per "1".equals("2")
.
Quindi, pensando all'ottimizzazione che il compilatore può fare, prima di tutto pensa a come il compilatore può comportarsi se una classe può essere ricompilata in seguito.
Come altro esempio, è possibile vedere how enum
is implemented e perché ha bisogno di un modo "strano".
hai provato? – durron597
Un modo sarebbe compilare un codice proprio così e vedere cosa viene restituito dal decompilatore :) – dasblinkenlight
Quale codice compilato è stato decompilato da? –