Guia das pré-condições da goiaba

Guia das pré-condições da goiaba

1. Visão geral

Neste tutorial, mostraremos como usar a classePreconditions do Google Guava.

A classePreconditions fornece uma lista de métodos estáticos para verificar se um método ou construtor é chamado com valores de parâmetro válidos. Se uma pré-condição falhar, uma exceção personalizada será lançada.

2. Preconditions do Google Guava

Cada método estático na classePreconditions tem três variantes:

  • Sem argumentos. Exceções são lançadas sem uma mensagem de erro

  • Um argumentoObject extra agindo como uma mensagem de erro. Exceções são lançadas com uma mensagem de erro

  • Um argumento String extra, com um número arbitrário de argumentosObject adicionais agindo como uma mensagem de erro com um espaço reservado. Este se comporta um pouco comoprintf, mas para compatibilidade e eficiência do GWT permite apenas indicadores de%s

Vamos dar uma olhada em como usar a classePreconditions.

2.1. Dependência do Maven

Vamos começar adicionando a dependência da biblioteca Guava do Google empom.xml:


    com.google.guava
    guava
    21.0

A versão mais recente da dependência pode ser verificadahere.

3. checkArgument

O métodoThecheckArgument doPreconditions class garante a veracidade dos parâmetros passados ​​para o método de chamada. Este método aceita uma condição booleana e lança umIllegalArgumentException quando a condição é falsa.

Vamos ver como podemos usar esse método com alguns exemplos.

3.1. Sem Mensagem de Erro

Podemos usarcheckArgument sem passar nenhum parâmetro extra para o métodocheckArgument:

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

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

3.2. Com uma mensagem de erro

Podemos obter uma mensagem de erro significativa do métodocheckArgument passando uma mensagem de erro:

@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. Com uma mensagem de erro de modelo

Podemos obter uma mensagem de erro significativa junto com os dados dinâmicos do métodocheckArgument passando uma mensagem de erro:

@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

O métodocheckElementIndex verifica se um índice é um índice válido em uma lista, string ou array de um tamanho especificado. Um índice de elemento pode variar de 0 inclusive a tamanho exclusivo. Você não passa uma lista, string ou array diretamente, apenas passa seu tamanho. Este método lança umIndexOutOfBoundsException se o índice não for um índice de elemento válido, caso contrário, ele retorna um índice que está sendo passado para o método.

Vamos ver como podemos usar esse método, mostrando uma mensagem de erro significativa do métodocheckElementIndex, passando uma mensagem de erro quando ele lança uma exceção:

@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

O métodocheckNotNull verifica se um valor fornecido como parâmetro é nulo. Ele retorna o valor que foi verificado. Se o valor que foi passado para este método for nulo, umNullPointerException será lançado.

A seguir, mostraremos como usar esse método, mostrando como obter uma mensagem de erro significativa do métodocheckNotNull passando uma mensagem de erro:

@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();
}

Também podemos obter uma mensagem de erro significativa com base em dados dinâmicos do métodocheckNotNull passando um parâmetro para a mensagem de erro:

@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

O métodocheckPositionIndex verifica se um índice passado como argumento para este método é um índice válido em uma lista, string ou array de um tamanho especificado. Um índice de posição pode variar de 0 inclusive a tamanho inclusive. Você não passa a lista, string ou array diretamente, apenas passa seu tamanho.

Este método lança umIndexOutOfBoundsException se o índice passado não estiver entre 0 e o tamanho fornecido, caso contrário, ele retorna o valor do índice.

Vamos ver como podemos obter uma mensagem de erro significativa do métodocheckPositionIndex:

@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

O métodocheckState verifica a validade do estado de um objeto e não depende dos argumentos do método. Por exemplo, umIterator pode usar isso para verificar se next foi chamado antes de qualquer chamada para remover. Este método lança umIllegalStateException se o estado de um objeto (valor booleano passado como um argumento para o método) estiver em um estado inválido.

Vamos ver como podemos usar esse método, mostrando uma mensagem de erro significativa do métodocheckState, passando uma mensagem de erro quando ele lança uma exceção:

@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. Conclusão

Neste tutorial, ilustramos os métodos da classePreConditions da biblioteca Guava. A classePreconditions fornece uma coleção de métodos estáticos que são usados ​​para validar se um método ou construtor é chamado com valores de parâmetro válidos.

O código pertencente aos exemplos acima pode ser encontrado emthe GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.