Перейти к основному содержимому

Java 9 java.util.Objects Дополнения

· 3 мин. чтения

1. Введение

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

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

2. Метод requireNonNullElse

Этот метод принимает два параметра и возвращает первый параметр, если он не равен null , и второй параметр в противном случае. Если оба параметра равны 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 , за исключением того, что второй параметр — это интерфейс 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. Использование контрольного индекса

Этот метод используется для проверки того, находится ли индекс в пределах заданной длины. Он возвращает индекс, если 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, 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. Заключение

Класс java.util.Objects в JDK 9 охватывает несколько новых служебных методов. Это также обнадеживает, потому что этот сервисный класс регулярно обновлялся с момента его появления в Java 7.

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