結局、願ったとおりに動かなかったので、思考錯誤したときのメモだけ残します。
環境
- Java
- 17
対応
Collections.singletonList(T o)
を使用することで、1行でnull許容した配列を作成できます。
動作確認
1行で配列を作成する方法は、List.of()
, Arrays.asList
のどちらもありますが、NotNull
制約があるので、作成できません。
ArrayList
はnullも追加可能ですが、初期配列の作成時には使えません。そもそも、初期配列の作成時のパラメータ自体が配列となるため、内部処理にてエラーが発生します。
var sample = new ArrayList<>(); assertAll( () -> assertThatThrownBy(() -> List.of(null)) .isInstanceOf(NullPointerException.class), () -> assertThatThrownBy(() -> Arrays.asList(null)) .isInstanceOf(NullPointerException.class), () -> assertThatThrownBy(() -> new ArrayList<>(null)) .isInstanceOf(NullPointerException.class), () -> Collections.singletonList(null), () -> sample.add(null) );
本当にやりたかったこと
戻り値としては配列で返却したいものの、内部の処理としては単数で受け取るメソッドがあるとします。現状、それを処理するためには4行の処理が必要だったので、1行に短縮したかったのです。
@Service @RequiredArgsConstructor public class SalesService { private final SalesComponent component; // NOTE: このコードは動かないので、イメージです public List<String> execute() { // あまり意味がないけど、4行必要 var list = new ArrayList<String>(); var result = component.execute(); list.add(result); return list; // 1行でシンプル! return Collections.singleton(component.execute()); } }
なお、配列にNullを許容するメリットはあるかというと、ありませんでした。
Springの設定で、nullの場合は値を出力しない設定があります。
spring.jackson.default-property-inclusion: NON_EMPTY
こちらの設定をすることで、配列にnullを許容しつつ、JSONのResponseBodyには影響しないと考えていました。しかし、上記の設定では期待とおりの設定はできません。インスタンスのフィールドが一部nullだった時の挙動だけが変わりました。インスタンスそのものがNullとして設定されていた場合は、出力されてしまいます。しかも、空文字列や空配列になるのではなく、null
と出力されてしまいました。
{ "salesList": [null] }
結局、素直にnullが入らないように処理しています。
@Service @RequiredArgsConstructor public class SalesService { private final SalesComponent component; public List<String> execute() { var result = component.execute(); if (result == null) { return List.of(); } else { return List.of(result); } } }
ソースコード
細かい挙動確認等々は、次のソースコードを確認してください。
終わりに
1行で書きたかったです…。もしくは、初期設定時やaddするときのパラメータは許容するものの、配列としてはパラメータを無視するようなメソッドがあるとうれしいのですが。まぁ、限定的な要望ですので、素直に処理するのが簡単ですね。