Java 9 java.util.Objectsの追加

Java 9 java.util.Objectsの追加

1. 前書き

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

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

2. requireNonNullElseメソッド

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

private List aMethodReturningNullList(){
    return null;
}

@Test
public void givenNullObject_whenRequireNonNullElse_thenElse() {
    List aList = Objects.requireNonNullElse(
      aMethodReturningNullList(), Collections.EMPTY_LIST);

    assertThat(aList, is(Collections.EMPTY_LIST));
}

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

@Test
public void givenObject_whenRequireNonNullElse_thenObject() {
    List aList = Objects.requireNonNullElse(
      aMethodReturningNonNullList(), Collections.EMPTY_LIST);

    assertThat(aList, is(List.of("item1", "item2")));
}

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

3. requireNonNullElseGetの使用

このメソッドは、the second parameter, is a java.util.function.Supplier interface which allows a lazy instantiation of the provided collection.を除いて、requireNonNullElseに似ています。Supplier実装は、以下に示すように、null以外のオブジェクトを返す役割を果たします。

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

4. checkIndexの使用

このメソッドは、インデックスが指定された長さ内にあるかどうかを確認するために使用されます。 0 ⇐ index < lengthの場合、インデックスを返します。 それ以外の場合は、以下に示すように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, length)によって形成される範囲内にあるかどうかを確認するために使用されます。 サブ範囲が有効な場合、以下に示すように下限を返します。

@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, length)によって形成される範囲内にあることを確認します。

@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. 結論

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

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