本日業務にてOptionalについて勘違いをしていたことに気付いたのでメモ。
Javaを書いていると、nullの安全性の観点からOptionalを使うことは大事だなと思いながらも、完全には理解できておらず、、
勘違いしていたケース
Jsonとマッピングする用のRequestBodyのクラスにて、以下のような定義をしていた。
Request.java
@Data
Public class Request {
Integer hogeId;
String hogeName;
Optional<Integer> maxLength; // Optionalで定義
}
上記のケースにて、リクエストで飛ばしたmaxLengthはOptionalでラップされていなかった。
その後request.getMaxLength().isPresent()という書き方をするとヌルポが発生し、気付いた。
getMaxLengthメンバ変数がnullになっていた。。
勝手にこの書き方でいけると思ってた。
実際には、この書き方ではOptionalにラップできないらしい。
Jsonとのマッピングがされないみたい。
書き直した
以下のように書き直した。
Request.java
@Data
Public class Request {
Integer hogeId;
String hogeName;
Integer maxLength; // Optionalやめた
public Optional<Integer> getMaxLength() {
// getterでOptional型で返すようにした
return Optional.ofNullable(this.maxLength);
}
}
上記のように書くことで、無事Optional型にできた。
lombokにて、@Dataによりgetterが自動生成されるが、上記のように設定すると自動生成されないらしい。
ただ、このようにRequestBodyでラップせず、Serviceクラス内でラップするのでも良いのではないかとは思うがどうなのか。。