- 環境
Java 11以上
数年ぶりにJava(サーバーサイド)を使う機会があり、Nullチェックの方法についてのメモ。
以下のようなクラスのオブジェクトのGetterにアクセスしたいが、オブジェクトもフィールドもnullかもしれない場合の実装方法について、検討してみた。
@Data
@AllArgsConstructor
@NoArgsConstructor
class SampleClass {
private BigDecimal bd;
}
よくある方法(やりたくない)
// ①nullだったら何らかの値にしたい場合
var str = (obj == null ? "" : (obj.getBd() == null ? "" : obj.getBd().toPlainString()));
System.out.println("str=" + str);
// ②nullだったら何もしたくない場合
if (Objects.nonNull(obj) && Objects.nonNull(obj.getBd())) {
System.out.println("str=" + obj.getBd().toPlainString());
}
②については、apache.commons.lang3
のObjectsUtil
を使えるかと思ったが、実行時例外が発生する。
if (ObjectUtils.allNotNull(obj, obj.getBd())) { // これは可変長引数の受け渡し時にNPE
System.out.println("str=" + obj.getBd().toPlainString());
}
Optionalを使用する方法
Kotlinだったら、obj?.bd?.toPlainString()
とかlet
といったスコープ演算子で簡潔に対応できそうだが、現時点のJavaには存在しないためOptionalを使用。
// ①nullだったら何らかの値にしたい場合
var str = Optional.ofNullable(obj).map(SampleClass::getBd).map(BigDecimal::toPlainString).orElse("");
System.out.println("str=" + str);
// ②nullだったら何もしたくない場合
Optional.ofNullable(obj).map(SampleClass::getBd).ifPresent(bd -> {
System.out.println("str=" + bd.toPlainString());
});