12

hereで説明されているように、javac およびその他の Java コンパイラはif、条件が「定数式」であるステートメントのコード削除機能を提供する場合があります。

私のコードが別のパッケージで定義された他の定数式に依存する定数式を使用している場合、これはどのような影響を受けますか?

たとえば、指定されたそれぞれのパッケージに次のクラスがあるとします。

package foo;

public class Foo {
    public static final boolean CONDITION = false;
}

package bar;

import foo.Foo;

public class Bar {
    public void test() {
        if (Foo.CONDITION) {
            System.out.println("This line of code could be eliminated.");
        } else {
            System.out.println("This line of code will be executed.");
        }
    }
}

明らかに、foo-package が実行時に外部の jar ファイルからロードされた場合、コンパイラはそれFoo.CONDITIONが false になると技術的に想定することはできずtrue、-statement のif-branch を削除すべきではありません。

一方、FooBarが実際に同じパッケージにある場合、true-branch は確実に削除する必要があります (コンパイラがコードの削除をサポートしている場合)。

この質問をどのように表現するのが最適かはよくわかりませんが、 の定数式が の定数と見なされるには、どれだけ「近い」Foo必要がありますか? それらは同じファイルにある必要がありますか?同じパッケージ?同じjarファイル?それともまったく問題ではありませんか (つまり、コンパイラは常に定数と見なし、コンパイル時にビルドパスで見つかった値を使用します)?BarFooBarFoo.CONDITION

4

2 に答える 2