悪いことですが、最適化されたバイトコードを生成できます。
Integeri
がほとんどの場合ではない場合null
、check は全体的なパフォーマンスを低下させます。チェック自体には 3 つの命令 (0 ~ 4) が必要です。ケース全体で 7 つの命令 (0 ~ 14) を使用します。
public class IfNotNull {
public Integer i;
public String getIAsString() {
if (i != null) {
return i.toString();
} else {
return "";
}
}
}
public java.lang.String getIAsString();
Code:
0: aload_0
1: getfield #2 // Field i:Ljava/lang/Integer;
4: ifnull 15
7: aload_0
8: getfield #2 // Field i:Ljava/lang/Integer;
11: invokevirtual #3 // Method java/lang/Integer.toString:()Ljava/lang/String;
14: areturn // <- here we go
15: ldc #4 // String
17: areturn
Python の世界で一般的な EAFP アプローチに従います。ケースはコストがかかりますが、null
ケースには 4 つの命令 (0 ~ 7) しか必要ありませんnot null
。
public class TryCatch {
public Integer i;
public String getIAsString() {
try {
return i.toString();
} catch (NullPointerException npe) {
return "";
}
}
}
public java.lang.String getIAsString();
Code:
0: aload_0
1: getfield #2 // Field i:Ljava/lang/Integer;
4: invokevirtual #3 // Method java/lang/Integer.toString:()Ljava/lang/String;
7: areturn // <- here we go
8: astore_1
9: ldc #5 // String a
11: areturn
Exception table:
from to target type
0 7 8 Class java/lang/NullPointerException
JITコンパイラがこれを最適化できるかどうか、誰が知っていますか?