型をoptionalに変えてバグった

テストのないコードに変更を加えたら動かなくなった
あるある感があったのでメモ

javaは「型があるから安心」ではない

元のコードはこんな感じ

public class SampleEntity {
   LocalDate date;
   ...
}

EntityがLocalDateを持ってる
これを仕様変更でOptionalにした

public class SampleEntity {
  Optional<LocalDate> date;
  ...
}

そうするとビルドエラーになるので、それを全部潰して完了!
っとなる予定が動かしてみると上手くいかない

よくよく調べてみると
このdateに対してequals()を呼んでる所があった

public class SampleEntity {
   LocalDate date;

   public boolean isSameDate(LocalDate now) {
       return this.date.equals(now);// ここでequals!!
   }
}

あぁ... equals()の引数はObject型だから型チェックが効かない... だからdateをLocalDateからOptionalに変えてもビルドエラーにならない... つらい...

※テスト書けって言わないで

型チェック付きeqメソッドを作る

解決策としては型でしばれるequals相当のメソッドを作って
equalsメソッドの利用を禁止すればいい

static <T> boolean eq(T v1, T v2, Class<T> c) {
   return v1.equals(v2);
}

呼び出し元

eq(this.date, now, LocalDate.class);

これで型変更時にビルドエラーになる
美しくはないけど守れる

テスト書けって言わないで

まとめ

テスト書きたくないがために堅牢なeqメソッドを作った
一応目的は果たせた
ちょっと汚いけど、、、まぁ。ね。