Panduan Pra-Syarat Jambu Batu

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menunjukkan cara menggunakan kelas Prekondisi Jambu Batu Google .

The Prasyarat kelas menyediakan senarai kaedah statik untuk memeriksa bahawa kaedah atau pembina dipergunakan dengan nilai-nilai parameter sah. Sekiranya prasyarat gagal, pengecualian disesuaikan akan dilemparkan.

2. Prasyarat Jambu Batu Google

Setiap kaedah statik di kelas Prekondisi mempunyai tiga varian:

  • Tiada hujah. Pengecualian dilemparkan tanpa mesej ralat
  • Argumen Objek tambahan bertindak sebagai mesej ralat. Pengecualian dilemparkan dengan mesej ralat
  • Argumen String tambahan, dengan sebilangan argumen Objek tambahan yang sewenang-wenang bertindak sebagai mesej ralat dengan placeholder. Ini berkelakuan seperti printf , tetapi untuk keserasian dan kecekapan GWT, ia hanya membenarkan penunjuk % s

Mari kita lihat cara menggunakan kelas Prekondisi .

2.1. Ketergantungan Maven

Mari mulakan dengan menambahkan kebergantungan perpustakaan Jambu biji Google di pom.xml :

 com.google.guava guava 29.0-jre 

Versi ketergantungan terkini boleh diperiksa di sini.

3. checkArgument

The Cara checkArgument daripada kelas Prasyarat memastikan kebenaran parameter diserahkan kepada kaedah yang memanggil. Kaedah ini menerima keadaan boolean dan melemparkan IllegalArgumentException apabila keadaannya salah.

Mari lihat bagaimana kita boleh menggunakan kaedah ini dengan beberapa contoh.

3.1. Tanpa Mesej Ralat

Kita boleh menggunakan checkArgument tanpa meneruskan parameter tambahan ke kaedah checkArgument :

@Test public void whenCheckArgumentEvaluatesFalse_throwsException() { int age = -18; assertThatThrownBy(() -> Preconditions.checkArgument(age > 0)) .isInstanceOf(IllegalArgumentException.class) .hasMessage(null).hasNoCause(); }

3.2. Dengan Mesej Ralat

Kita boleh mendapatkan mesej ralat yang bermakna dari kaedah checkArgument dengan menyampaikan mesej ralat:

@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. Dengan Mesej Ralat Templat

Kita boleh mendapatkan mesej ralat yang bermakna bersama dengan data dinamik dari kaedah checkArgument dengan menyampaikan mesej ralat:

@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

Kaedah checkElementIndex memeriksa bahawa indeks adalah indeks yang sah dalam senarai, rentetan atau susunan ukuran yang ditentukan. Indeks elemen boleh berkisar dari 0 inklusif hingga ukuran eksklusif. Anda tidak meneruskan senarai, rentetan atau array secara langsung, anda hanya lulus ukurannya. Kaedah ini membuang IndexOutOfBoundsException jika indeks bukan elemen indeks yang sah, jika tidak, ia mengembalikan indeks yang dilewatkan ke kaedah.

Mari lihat bagaimana kita dapat menggunakan kaedah ini dengan menunjukkan mesej ralat yang bermakna dari kaedah checkElementIndex dengan menyampaikan mesej ralat ketika melemparkan pengecualian:

@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. semakNotNull

Kaedah checkNotNull memeriksa sama ada nilai yang diberikan sebagai parameter adalah nol. Ia mengembalikan nilai yang telah diperiksa. Sekiranya nilai yang telah diteruskan ke kaedah ini adalah nol, maka NullPointerException akan dilemparkan.

Seterusnya, kami akan menunjukkan cara menggunakan kaedah ini dengan menunjukkan cara mendapatkan mesej ralat yang bermakna dari kaedah checkNotNull dengan menyampaikan mesej ralat:

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

Kita juga boleh mendapatkan mesej ralat yang bermakna berdasarkan data dinamik dari kaedah checkNotNull dengan meneruskan parameter ke mesej ralat:

@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

Kaedah checkPositionIndex memeriksa bahawa indeks yang dilewatkan sebagai argumen kepada kaedah ini adalah indeks yang sah dalam senarai, rentetan atau susunan ukuran yang ditentukan. Indeks kedudukan boleh berkisar antara 0 inklusif hingga ukuran inklusif. Anda tidak meneruskan senarai, rentetan atau susunan secara langsung, anda hanya lulus ukurannya.

Kaedah ini membuang IndexOutOfBoundsException jika indeks yang dilalui tidak antara 0 dan ukuran yang diberikan, jika tidak, ia mengembalikan nilai indeks.

Mari lihat bagaimana kita boleh mendapatkan mesej ralat yang bermakna dari kaedah 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

Kaedah checkState memeriksa kesahan keadaan objek dan tidak bergantung pada argumen kaedah. Sebagai contoh, Iterator mungkin menggunakan ini untuk memeriksa bahawa yang berikutnya telah dipanggil sebelum ada panggilan untuk dikeluarkan. Kaedah ini melemparkan IllegalStateException jika keadaan objek (nilai boolean diteruskan sebagai argumen ke kaedah) berada dalam keadaan tidak sah.

Mari lihat bagaimana kita dapat menggunakan kaedah ini dengan menunjukkan mesej ralat yang bermakna dari kaedah checkState dengan menyampaikan mesej ralat ketika membuang pengecualian:

@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. Kesimpulannya

Dalam tutorial ini, kami menggambarkan kaedah kelas PreConditions dari perpustakaan Jambu. The Prasyarat kelas menyediakan koleksi kaedah statik yang digunakan untuk validate bahawa kaedah atau pembina dipergunakan dengan nilai-nilai parameter sah.

Kod yang termasuk dalam contoh di atas boleh didapati dalam projek GitHub - ini adalah projek yang berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.