1概要

このチュートリアルでは、Google Guavaの

Preconditions

クラスの使用方法について説明します。


Preconditions

クラスは、メソッドまたはコンストラクターが有効なパラメーター値で呼び出されたことを確認するための静的メソッドのリストを提供します。

前提条件が失敗すると、調整された例外がスローされます。


2 Google Guavaの

前提条件



Preconditions

クラスの各静的メソッドには、3つのバリアントがあります。

  • 引数はありません。エラーメッセージなしで例外がスローされる

  • エラーメッセージとして機能する追加の

    Object

    引数。例外は

エラーメッセージとともにスローされる
** 追加の任意の数の追加のString引数

プレースホルダを持つエラーメッセージとして機能する

Object

引数。これは

printf

に少し似ていますが、GWTの互換性と効率のために

%s

のインディケータしか許可しません。


Preconditions

クラスの使い方を見てみましょう。


2.1. Mavenの依存関係

まず、

pom.xml

にGoogleのGuavaライブラリ依存関係を追加します。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>21.0</version>
</dependency>

依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guava%22[ここに]。

** 3

checkArgument


**


Preconditionsクラスの

The

method

checkArgument

は、呼び出し側メソッドに渡されるパラメータの真実性を保証します。このメソッドはブール条件を受け入れ、条件がfalseの場合に

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かどうかをチェックします。チェックされた値を返します。このメソッドに渡された値が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からサイズの両端を含む範囲であり得る。リスト、文字列、配列を直接渡すのではなく、単にそのサイズを渡すだけです。

渡されたインデックスが0と指定されたサイズの間にない場合、このメソッドは

IndexOutOfBoundsException

をスローします。それ以外の場合、インデックス値を返します。


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

は、removeを呼び出す前に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結論

このチュートリアルでは、Guavaライブラリの

PreConditions

クラスのメソッドを説明しました。

Preconditions

クラスは、メソッドまたはコンストラクターが有効なパラメーター値で呼び出されたことを検証するために使用される静的メソッドのコレクションを提供します。

上記の例に属するコードはhttps://github.com/eugenp/tutorials/tree/master/guava[the GitHub project]にあります。そのまま実行します。