今日の実務で、実装レビューにて指摘があった箇所を備忘録として残す。
Javaの経験が浅い方や、古いバージョン(8以前)を中心に実装していた方もためになるかと思います。
Stringクラスのequalsメソッド
Java歴が浅い方や最近学習を始めたという方は、文字列比較のために、Stringクラスのequalsメソッドを基本として学ぶと思います。
(僕も研修や独学時代はこれしか学びませんでしたし、今も癖で使ってしまいます。)
Stringクラスのequalsメソッドは、比較する文字列が同値であるかどうかを判定してくれます。
なので、参照先が異なっていたとしてもtrueを返却してくれます。
String a = "あいう";
String b = "あいう";
String c = new String("あいう");
System.out.print(a.equals(b));//true
System.out.print(a.equals(c));//true
(余談:実はObjectクラスのequalsメソッドをStringクラスがオーバーライドしてくれていたことは知らずに使っていました。
Objectクラスのequalsメソッドは同一性を判定してれます。)
nullの可能性がある場合は必ずnull判定が必要になる
実務内では、かなりnullの考慮が必要だと感じています。
利用する変数にnullが入ってくる可能性があるのであれば、nullチェックもしくはnullを許容してくれる実装をしなければいけません。
例えば、以下ではNullPointerExceptionが発生します。
String a = null;
String b = "あいう";
System.out.print(a.equals(b));//ヌルポで落ちます
障害が起きてしまうので、こういったnullが入る可能性のある変数には、nullチェックが必要です。
String a = null;
String b = "あいう";
if (a!=null) {
System.out.print(a.equals(b));//実行されない
}
Objectsクラスのequalsメソッドを使う
nullチェックを毎度やるのは大変
毎度if文でnullチェックを行うのは、if文をネストしてしまう原因にもなり、可読性が落ちます。
なので、今僕はOptional型を使ったりしてうまく回避していくのですが、今回はObjectsクラスのequalsメソッドを利用しました。
String a = null;
String b = "あいう";
String c = null;
System.out.print(a.equals(b)); // false
System.out.print(a.equals(c)); // true
Objectsクラスのequalsメソッドはnull同士でも比較できる優れもので、NullPointerExceptionが発生する可能性はありません。
変数にnullの可能性がある場合については、こちらを利用する癖をつけていきたいです。