«1. Введение

Класс java.util.Objects является частью Java, начиная с версии 1.7. Этот класс предоставляет статические служебные методы для объектов, которые можно использовать для выполнения некоторых повседневных задач, таких как проверка на равенство, проверка нулей и т. д.

В этой статье мы рассмотрим новые методы, представленные в пакете java.util. Класс Objects в Java 9.

2. Метод requireNonNullElse

Этот метод принимает два параметра и возвращает первый параметр, если он не равен нулю, и второй параметр в противном случае. Если оба параметра равны нулю, генерируется исключение 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, за исключением того, что вторым параметром является интерфейс java.util.function.Supplier, который позволяет выполнять ленивый создание экземпляра предоставленной коллекции. Реализация поставщика отвечает за возврат ненулевого объекта, как показано ниже:

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

4. Использование checkIndex

Этот метод используется для проверки того, находится ли индекс в пределах заданной длины. Он возвращает индекс, если 0 \u003c= индекс \u003c длина. В противном случае выдается исключение 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 и исключает б. [ и ] указывают, что число включено, а ( и ) указывают, что число исключено.

6. Использование checkFromIndexSize

Этот метод похож на checkFromToIndex, за исключением того, что вместо верхней границы поддиапазона мы предоставляем размер и нижнюю границу поддиапазона.

Поддиапазон в данном случае равен [fromIndex, fromIndex + размер), и этот метод проверяет, что поддиапазон находится в пределах диапазона, образованного [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. Заключение ~ ~~ Класс java.util.Objects в JDK 9 охватывает несколько новых служебных методов. Это также обнадеживает, потому что этот сервисный класс регулярно обновлялся с момента его появления в Java 7.

Код для этой статьи можно найти на GitHub.

«