Java初心者なので、戻り値の型がLong
なAPIを使いたいけどnullとか嫌だからlong
にしちゃおーといって適当にAuto boxingしたらNullPointerException
が出てしまった。こんな感じ。
// SomeLibrary#count の戻り値の型はLong long count = SomeLibrary.count(); // => NullPointerException
あれ、そうだっけ?nullだったら勝手に0l
とかになってくんないの?と思ってJShellでも試してみる。
jshell> Long wrapper = null; wrapper ==> null jshell> long primitive = wrapper; | 例外java.lang.NullPointerException | at (#2:1)
まあそもそもラッパークラスになってる時点でnullを許容する必要があり、nullであるという状態は何かしらの意味を持っている(はず)のだからちゃんとnullの時に対応するコードをかけということだとは思うけれども、それでもなおnullとかいらねーよというときはある。皆さんもあるでしょう。多分。結局Optional
使ってこんな感じで書けばいいということだろうか。
jshell> long primitive = Optional.ofNullable(wrapper).orElse(0l); result ==> 0
Optional
がなかったら一旦Long
型の変数に入れてからif文でnullチェックして云々みたいなことが必要そうなので、Optional
のおかげで少しは書きやすくなっているということだろうか。しかし、本質的には明示的なnullチェックとそんなに変わらない気がするし、どうせだったらnull合体演算子とかエルビス演算子みたいなの導入してくんないかなあ。long primitive = wrapper ?: 0l
とかで書ければ楽なんだけどねえ。