主なルールは、コンパイラが単一のクラスにあるソースコードから正確な値を差し引くことができる場合です。最小のコンパイル単位であるクラスのみを使用してすべての最適化を行うためです。コードを書くと
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");
}
}
コンパイラは、このクラスのステートメントに関連するすべてのコードを確認し、if 条件を最適化します。逆コンパイラ後、コードは次のようになります
public class Test
{
private static final String i = "1";
public static void main(String[] paramArrayOfString)
{
System.out.println("world");
}
}
(私はjd-guiを使用しました)
ただし、 で置き換える==
と.equals
、コンパイラはメソッドがどのように機能するかを想定できません.equals
。クラスのコンパイル後Test
、JDK をハックして、 for を返すクラスの別のバージョンを配置できるためjava.lang.String
です。true
"1".equals("2")
したがって、コンパイラが実行できる最適化について考えるときは、まず、後でクラスを再コンパイルできる場合にコンパイラがどのように動作するかを考えてください。
別の例として、 がどのようenum
に実装され、なぜそのような「奇妙な」方法が必要なのかを確認できます。