Panduan untuk Prekondisi Jambu Biji

1. Ikhtisar

Dalam tutorial ini, kami akan menunjukkan cara menggunakan kelas Prasyarat Google Guava .

Kelas Preconditions menyediakan daftar metode statis untuk memeriksa bahwa metode atau konstruktor dipanggil dengan nilai parameter yang valid. Jika prasyarat gagal, pengecualian yang disesuaikan dilemparkan.

2. Prasyarat Google Guava

Setiap metode statis di kelas Preconditions memiliki tiga varian:

  • Tidak ada argumen. Pengecualian diberikan tanpa pesan kesalahan
  • Argumen Objek tambahan yang bertindak sebagai pesan kesalahan. Pengecualian diberikan dengan pesan kesalahan
  • Argumen String tambahan, dengan sejumlah argumen Objek tambahan yang bertindak sebagai pesan kesalahan dengan placeholder. Ini berperilaku sedikit seperti printf , tetapi untuk kompatibilitas dan efisiensi GWT, ini hanya memungkinkan indikator % s

Mari kita lihat bagaimana menggunakan kelas Prekondisi .

2.1. Ketergantungan Maven

Mari kita mulai dengan menambahkan dependensi pustaka Guava Google di pom.xml :

 com.google.guava guava 29.0-jre 

Versi terbaru dari ketergantungan tersebut dapat diperiksa di sini.

3. checkArgument

The Metode checkArgument dari kelas Prakondisi memastikan kebenaran dari parameter yang dikirimkan ke metode menelepon. Metode ini menerima kondisi boolean dan melontarkan IllegalArgumentException jika kondisinya salah.

Mari kita lihat bagaimana kita dapat menggunakan metode ini dengan beberapa contoh.

3.1. Tanpa Pesan Kesalahan

Kita bisa menggunakan checkArgument tanpa memberikan parameter tambahan apa pun ke metode checkArgument :

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

3.2. Dengan Pesan Kesalahan

Kita bisa mendapatkan pesan kesalahan yang berarti dari metode checkArgument dengan meneruskan pesan kesalahan:

@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 Pesan Kesalahan Template

Kita bisa mendapatkan pesan kesalahan yang berarti bersama dengan data dinamis dari metode checkArgument dengan meneruskan pesan kesalahan:

@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

Metode checkElementIndex memeriksa bahwa indeks adalah indeks yang valid dalam daftar, string, atau larik dengan ukuran yang ditentukan. Indeks elemen dapat berkisar dari 0 inklusif hingga ukuran eksklusif. Anda tidak mengirimkan daftar, string, atau larik secara langsung, Anda hanya meneruskan ukurannya. Metode ini melontarkan IndexOutOfBoundsException jika indeks tersebut bukan indeks elemen yang valid, jika tidak metode ini mengembalikan indeks yang sedang diteruskan ke metode.

Mari kita lihat bagaimana kita dapat menggunakan metode ini dengan menunjukkan pesan kesalahan yang berarti dari metode checkElementIndex dengan meneruskan pesan kesalahan saat ia melontarkan 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. checkNotNull

Metode checkNotNull memeriksa apakah nilai yang diberikan sebagai parameter adalah null. Ini mengembalikan nilai yang telah diperiksa. Jika nilai yang telah diteruskan ke metode ini adalah null, NullPointerException akan dilempar.

Selanjutnya, kami akan menunjukkan cara menggunakan metode ini dengan menunjukkan cara mendapatkan pesan kesalahan yang berarti dari metode checkNotNull dengan meneruskan pesan kesalahan:

@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 bisa mendapatkan pesan kesalahan yang berarti berdasarkan data dinamis dari metode checkNotNull dengan meneruskan parameter ke pesan kesalahan:

@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

Metode checkPositionIndex memeriksa bahwa indeks yang diteruskan sebagai argumen untuk metode ini adalah indeks yang valid dalam daftar, string, atau larik dengan ukuran yang ditentukan. Indeks posisi dapat berkisar dari 0 inklusif hingga ukuran inklusif. Anda tidak meneruskan daftar, string, atau larik secara langsung, Anda hanya meneruskan ukurannya.

Metode ini melontarkan IndexOutOfBoundsException jika indeks yang diteruskan tidak antara 0 dan ukuran yang diberikan, jika tidak, metode ini mengembalikan nilai indeks.

Mari kita lihat bagaimana kita bisa mendapatkan pesan kesalahan yang berarti dari metode 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

Metode checkState memeriksa validitas status suatu objek dan tidak bergantung pada argumen metode. Misalnya, Iterator mungkin menggunakan ini untuk memeriksa bahwa panggilan berikutnya telah dipanggil sebelum panggilan apa pun untuk dihapus. Metode ini melontarkan IllegalStateException jika status objek (nilai boolean yang diteruskan sebagai argumen ke metode) dalam status tidak valid.

Mari kita lihat bagaimana kita dapat menggunakan metode ini dengan menunjukkan pesan kesalahan yang berarti dari metode checkState dengan meneruskan pesan kesalahan saat ia melontarkan 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. Kesimpulan

Dalam tutorial ini, kami mengilustrasikan metode kelas PreConditions dari pustaka Guava. Kelas Preconditions menyediakan kumpulan metode statis yang digunakan untuk memvalidasi bahwa metode atau konstruktor dipanggil dengan nilai parameter yang valid.

Kode yang termasuk dalam contoh di atas dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.