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 .