きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Javaで比較するときはObjects.equalsを使うのがオススメ

小ネタ。正直、記述量が増えるので好き嫌いで言うと嫌いですが、NullPointerException(以後、NPE)が発生しなくなるので安全に処理したい時はオススメです。

環境

  • Java
    • 15

出現時期

  • java.util.Objects
    • Java1.7

Java7の時代からあります。分かりづらいですが、Objectではないです。Objectsです。

使い方

Objects.equals(Object a, Object b);

どの辺が便利か

安全に比較することができます。特にプリミティブ型のラッパークラス(Integer, Boolean)等はnullになりうります。もし、nullと比較してしまうと、NPEが発生してしまいます。

@Test
void test_01() {
  boolean param1 = true;
  Boolean param2 = null;
  try {
    var actual = param1 == param2;
    Assert.fail();
  } catch (NullPointerException e) {
  } catch (Exception e) {
    Assert.fail();
  }
}

Objects.equalsを使用すると、NPEが発生せずにfalseが返却されます。

@Test
void test_02() {
  boolean param1 = true;
  Boolean param2 = null;
  assertThat(
      Objects.equals(param1, param2)
  ).isEqualTo(false);
}

なお、当然ですがObjects.equalsに渡す前にNPEが発生する場合は、NPEになります。

static class Nested {
  public Boolean bool;
  public Nested(Boolean bool){
    this.bool = bool;
  }
}

@Test
void test_05() {
  boolean param1 = true;
  Nested param2 = null;
  try {
    Objects.equals(param1, param2.bool);
    Assert.fail();
  } catch (NullPointerException e) {
  } catch (Exception e) {
    Assert.fail();
  }
}

ソースコード

終わりに

Java7が出た時期は2011年7月ですので、もうこちらのクラスを知っている人は多いと思います。

地味ですが、NPEを回避できますのでぜひ使ってみて下さい。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

f:id:nainaistar:20210620141146p:plain