今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

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 static  T eval(Evaluator evaluator) {
    try {
        return evaluator.eval();
    } catch (NullPointerException e) {
        return null;
    }
}

みたいなメソッドを定義しておけば、

BigDecimal result = eval(() -> n1.add(n2)); 

のように書ける!

...そんなに綺麗じゃないか。