Руководство по предварительным условиям Гуавы

Руководство по предварительным условиям Гуавы

1. обзор

В этом руководстве мы покажем, как использовать класс Google GuavaPreconditions.

КлассPreconditions предоставляет список статических методов для проверки того, что метод или конструктор вызывается с допустимыми значениями параметров. Если предварительное условие не выполняется, создается специальное исключение.

2. Preconditions в Google Guava

Каждый статический метод в классеPreconditions имеет три варианта:

  • Нет аргументов. Исключения выбрасываются без сообщения об ошибке

  • Дополнительный аргументObject действует как сообщение об ошибке. Исключения выдаются с сообщением об ошибке

  • Дополнительный аргумент String с произвольным количеством дополнительных аргументовObject, действующий как сообщение об ошибке с заполнителем. Это немного похоже наprintf, но для совместимости и эффективности GWT допускает только индикаторы%s

Давайте посмотрим, как использовать классPreconditions.

2.1. Maven Dependency

Начнем с добавления зависимости библиотеки Google Guava вpom.xml:


    com.google.guava
    guava
    21.0

Последнюю версию зависимости можно проверитьhere.

3. checkArgumentс

The методcheckArgument изPreconditions class обеспечивает достоверность параметров, переданных вызывающему методу. Этот метод принимает логическое условие и выдаетIllegalArgumentException, если условие ложно.

Давайте посмотрим, как мы можем использовать этот метод на некоторых примерах.

3.1. Без сообщения об ошибке

Мы можем использоватьcheckArgument без передачи каких-либо дополнительных параметров методуcheckArgument:

@Test
public void whenCheckArgumentEvaluatesFalse_throwsException() {
    int age = -18;

    assertThatThrownBy(() -> Preconditions.checkArgument(age > 0))
      .isInstanceOf(IllegalArgumentException.class)
      .hasMessage(null).hasNoCause();
}

3.2. С сообщением об ошибке

Мы можем получить значимое сообщение об ошибке из методаcheckArgument, передав сообщение об ошибке:

@Test
public void givenErrorMsg_whenCheckArgEvalsFalse_throwsException() {
    int age = -18;
    String message = "Age can't be zero or less than zero.";

    assertThatThrownBy(() -> Preconditions.checkArgument(age > 0, message))
      .isInstanceOf(IllegalArgumentException.class)
      .hasMessage(message).hasNoCause();
}

3.3. С сообщением об ошибке шаблона

Мы можем получить содержательное сообщение об ошибке вместе с динамическими данными из методаcheckArgument, передав сообщение об ошибке:

@Test
public void givenTemplateMsg_whenCheckArgEvalsFalse_throwsException() {
    int age = -18;
    String message = "Age should be positive number, you supplied %s.";

    assertThatThrownBy(
      () -> Preconditions.checkArgument(age > 0, message, age))
      .isInstanceOf(IllegalArgumentException.class)
      .hasMessage(message, age).hasNoCause();
}

4. checkElementIndexс

МетодcheckElementIndex проверяет, является ли индекс допустимым индексом в списке, строке или массиве указанного размера. Индекс элемента может варьироваться от 0 включительно до исключительного размера. Вы не передаете напрямую список, строку или массив, вы просто передаете его размер. Этот метод выдаетIndexOutOfBoundsException, если индекс не является допустимым индексом элемента, иначе он возвращает индекс, который передается в метод.

Давайте посмотрим, как мы можем использовать этот метод, показывая значимое сообщение об ошибке из методаcheckElementIndex, передавая сообщение об ошибке, когда он вызывает исключение:

@Test
public void givenArrayAndMsg_whenCheckElementEvalsFalse_throwsException() {
    int[] numbers = { 1, 2, 3, 4, 5 };
    String message = "Please check the bound of an array and retry";

    assertThatThrownBy(() ->
      Preconditions.checkElementIndex(6, numbers.length - 1, message))
      .isInstanceOf(IndexOutOfBoundsException.class)
      .hasMessageStartingWith(message).hasNoCause();
}

5. checkNotNullс

МетодcheckNotNull проверяет, является ли значение, указанное в качестве параметра, нулевым. Возвращает проверенное значение. Если значение, которое было передано этому методу, равно null, то выдаетсяNullPointerException.

Далее мы собираемся показать, как использовать этот метод, показав, как получить значимое сообщение об ошибке из методаcheckNotNull, передав сообщение об ошибке:

@Test
public void givenNullString_whenCheckNotNullWithMessage_throwsException () {
    String nullObject = null;
    String message = "Please check the Object supplied, its null!";

    assertThatThrownBy(() -> Preconditions.checkNotNull(nullObject, message))
      .isInstanceOf(NullPointerException.class)
      .hasMessage(message).hasNoCause();
}

Мы также можем получить значимое сообщение об ошибке на основе динамических данных из методаcheckNotNull, передав параметр в сообщение об ошибке:

@Test
public void whenCheckNotNullWithTemplateMessage_throwsException() {
    String nullObject = null;
    String message = "Please check the Object supplied, its %s!";

    assertThatThrownBy(
      () -> Preconditions.checkNotNull(nullObject, message,
        new Object[] { null }))
      .isInstanceOf(NullPointerException.class)
      .hasMessage(message, nullObject).hasNoCause();
}

6. checkPositionIndexс

МетодcheckPositionIndex проверяет, является ли индекс, переданный в качестве аргумента этому методу, допустимым индексом в списке, строке или массиве указанного размера. Индекс позиции может варьироваться от 0 включительно до размера включительно. Вы не передаете напрямую список, строку или массив, вы просто передаете его размер.

Этот метод выдаетIndexOutOfBoundsException, если переданный индекс не находится между 0 и заданным размером, иначе он возвращает значение индекса.

Давайте посмотрим, как мы можем получить содержательное сообщение об ошибке из методаcheckPositionIndex:

@Test
public void givenArrayAndMsg_whenCheckPositionEvalsFalse_throwsException() {
    int[] numbers = { 1, 2, 3, 4, 5 };
    String message = "Please check the bound of an array and retry";

    assertThatThrownBy(
      () -> Preconditions.checkPositionIndex(6, numbers.length - 1, message))
      .isInstanceOf(IndexOutOfBoundsException.class)
      .hasMessageStartingWith(message).hasNoCause();
}

7. checkStateс

МетодcheckState проверяет достоверность состояния объекта и не зависит от аргументов метода. Например,Iterator может использовать это, чтобы проверить, что next был вызван перед любым вызовом для удаления. Этот метод выдаетIllegalStateException, если состояние объекта (логическое значение, переданное в качестве аргумента методу) находится в недопустимом состоянии.

Давайте посмотрим, как мы можем использовать этот метод, показывая значимое сообщение об ошибке из методаcheckState, передавая сообщение об ошибке, когда он вызывает исключение:

@Test
public void givenStatesAndMsg_whenCheckStateEvalsFalse_throwsException() {
    int[] validStates = { -1, 0, 1 };
    int givenState = 10;
    String message = "You have entered an invalid state";

    assertThatThrownBy(
      () -> Preconditions.checkState(
        Arrays.binarySearch(validStates, givenState) > 0, message))
      .isInstanceOf(IllegalStateException.class)
      .hasMessageStartingWith(message).hasNoCause();
}

8. Заключение

В этом руководстве мы проиллюстрировали методы классаPreConditions из библиотеки Guava. КлассPreconditions предоставляет набор статических методов, которые используются для проверки того, что метод или конструктор вызывается с допустимыми значениями параметров.

Код, принадлежащий приведенным выше примерам, можно найти вthe GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.