nullを含む演算をどう処理するか?
BigDecimal result = n1.add(n2);
みたいなとき、n1あるいはn2がnullだとNullPointerExceptionが投げられる。
でも、そうではなくてresultもnullになってほしい、という場合がある。
こういうとき、どうするか?
nullチェックを直接入れるとコードが見にくくなるので、別メソッドとして定義してみる。
public static BigDecimal add(BigDecimal n1, BigDecimal n2) { if (n1 == null || n2 == null) { return null; } return n1.add(n2); }
staticメソッドをimportしておけば、
BigDecimal result = add(n1, n2);
みたいにきれいに書ける。
でも演算メソッドごとにラッパメソッドを定義するのもめんどい。Java8で導入されたラムダ式を利用して何とかならないか?と考えてみた。
public static interface Evaluator{ T eval(); }
みたいなインターフェイスと、
public staticT eval(Evaluator evaluator) { try { return evaluator.eval(); } catch (NullPointerException e) { return null; } }
みたいなメソッドを定義しておけば、
BigDecimal result = eval(() -> n1.add(n2));
のように書ける!
...そんなに綺麗じゃないか。