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 を削除すべきではありません。
一方、Foo
とBar
が実際に同じパッケージにある場合、true
-branch は確実に削除する必要があります (コンパイラがコードの削除をサポートしている場合)。
この質問をどのように表現するのが最適かはよくわかりませんが、 の定数式が の定数と見なされるには、どれだけ「近い」Foo
必要がありますか? それらは同じファイルにある必要がありますか?同じパッケージ?同じjarファイル?それともまったく問題ではありませんか (つまり、コンパイラは常に定数と見なし、コンパイル時にビルドパスで見つかった値を使用します)?Bar
Foo
Bar
Foo.CONDITION