1前書き

java.util.Objects__クラスは、バージョン1.7以降Javaの一部となっています。

このクラスは、等価性のチェック、

null

チェックなど、日常的なタスクのいくつかを実行するために使用できるオブジェクトの静的ユーティリティメソッドを提供します

この記事では、Java 9の

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

インタフェースです。**

Supplier

実装は、以下に示すようにnull以外のオブジェクトを返す責任があります。 :

@Test
public void givenObject__whenRequireNonNullElseGet__thenObject() {
    List<String> aList = Objects.<List>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を含まないことを示します。[and]は数字が含まれていることを示し、(and)は数字が除外されていることを示します。


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で導入されて以来、定期的に更新されてきたため、これもまた有望です。

この記事のコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-9[GitHubで利用可能]です。