1. 序章

java.util.Objects クラスは、バージョン1.7以降Javaの一部になっています。 このクラスは、同等性のチェック、nullチェックなどの日常的なタスクの一部を実行するために使用できるオブジェクトの静的ユーティリティメソッドを提供します。

この記事では、Java9のjava.util.Objectsクラスで導入された新しいメソッドについて説明します。

2. requireNonNullElseメソッド

このメソッドは2つのパラメーターを受け入れ、 null でない場合は最初のパラメーターを返し、そうでない場合は2番目のパラメーターを返します。 両方のパラメーターがnullの場合、NullPointerExceptionをスローします。

private List<String> aMethodReturningNullList(){
    return null;
}

@Test
public void givenNullObject_whenRequireNonNullElse_thenElse() {
    List<String> aList = Objects.<List>requireNonNullElse(
      aMethodReturningNullList(), Collections.EMPTY_LIST);
 
    assertThat(aList, is(Collections.EMPTY_LIST));
}

private List<String> aMethodReturningNonNullList() {
    return List.of("item1", "item2");
}

@Test
public void givenObject_whenRequireNonNullElse_thenObject() {
    List<String> aList = Objects.<List>requireNonNullElse(
      aMethodReturningNonNullList(), Collections.EMPTY_LIST);
 
    assertThat(aList, is(List.of("item1", "item2")));
}

@Test(expected = NullPointerException.class)
public void givenNull_whenRequireNonNullElse_thenException() {
    Objects.<List>requireNonNullElse(null, null);
}

3. requireNonNullElseGetを使用する

このメソッドはrequireNonNullElseに似ていますが、 2番目のパラメーターがjava.util.function.Supplierインターフェースであり、提供されたコレクションの遅延インスタンス化を可能にします。 Supplyer 実装は、以下に示すようにnull以外のオブジェクトを返す責任があります。

@Test
public void givenObject_whenRequireNonNullElseGet_thenObject() {
    List<String> aList = Objects.<List>requireNonNullElseGet(
      null, List::of);
    assertThat(aList, is(List.of()));
}

4. checkIndexを使用する

このメソッドは、インデックスが指定された長さの範囲内にあるかどうかを確認するために使用されます。 次の場合にインデックスを返します 0<=インデックス<長さ 。 それ以外の場合は、以下に示すようにIndexOutOfBoundsExceptionをスローします。

@Test
public void givenNumber_whenInvokeCheckIndex_thenNumber() {
    int length = 5;
 
    assertThat(Objects.checkIndex(4, length), is(4));
}

@Test(expected = IndexOutOfBoundsException.class)
public void givenOutOfRangeNumber_whenInvokeCheckIndex_thenException() {
    int length = 5;
    Objects.checkIndex(5, length);
}

5. checkFromToIndexを使用する

このメソッドは、 [fromIndex、toIndex)によって形成される特定のサブ範囲が [0、長さ)によって形成される範囲内にあるかどうかを確認するために使用されます。 サブ範囲が有効な場合、以下に示すように下限を返します。

@Test
public void givenSubRange_whenCheckFromToIndex_thenNumber() {
    int length = 6;
 
    assertThat(Objects.checkFromToIndex(2,length,length), is(2));
}

@Test(expected = IndexOutOfBoundsException.class)
public void givenInvalidSubRange_whenCheckFromToIndex_thenException() {
    int length = 6;
    Objects.checkFromToIndex(2,7,length);
}

注:数学では、[a、b)の形式で表される範囲は、範囲がaを含み、bを含まないことを示します。 [と]は番号が含まれていることを示し、(と)は番号が除外されていることを示します。

6. checkFromIndexSizeを使用する

このメソッドは、 checkFromToIndex に似ていますが、サブ範囲の上限を指定する代わりに、サブ範囲のサイズと下限を指定する点が異なります。

この場合、サブ範囲は [fromIndex、fromIndex + size)であり、このメソッドは、サブ範囲が [0、長さ)によって形成される範囲内にあることを確認します。

@Test
public void givenSubRange_whenCheckFromIndexSize_thenNumber() {
    int length = 6;
 
    assertThat(Objects.checkFromIndexSize(2,3,length), is(2));
}

@Test(expected = IndexOutOfBoundsException.class)
public void givenInvalidSubRange_whenCheckFromIndexSize_thenException() {
    int length = 6;
    Objects.checkFromIndexSize(2, 6, length);
}

7. 結論

JDK9のjava.util.Objectsクラスは、いくつかの新しいユーティリティメソッドをカバーしています。 このサービスクラスは、Java 7で導入されて以来、定期的に更新されているため、これも心強いことです。

この記事のコードは、GitHubにあります。