Guava Preconditions類的各種用法

2023-12-06 15:00:31

公眾號「架構成長指南」,專注於生產實踐、雲原生、分散式系統、巨量資料技術分享。
Guava Preconditions類 提供靜態方法列表,用於檢查是否使用有效引數值呼叫方法或建構函式。如果前提條件失敗,則會丟擲指定的異常。

前置依賴

引入 pom

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>32.1.3-jre</version>
</dependency>

checkArgument

Preconditions類的checkArgument方法用於校驗傳遞給呼叫方法的引數的正確性。該方法接收一個布林條件,當條件為false時,丟擲IllegalArgumentException異常。
讓我們通過一些範例來看看如何使用這個方法。

import com.google.common.base.Preconditions;

public class ExampleClass {
    public void processNumber(int number) {
        Preconditions.checkArgument(number > 0, "Number must be positive");
        // 進行處理邏輯
    }

    public static void main(String[] args) {
        ExampleClass example = new ExampleClass();
        example.processNumber(10); // 正常呼叫,引數符合條件

        example.processNumber(-5); // 丟擲IllegalArgumentException異常,引數不符合條件
    }
}

丟擲帶有模板的錯誤資訊

public class PreconditionsTest {
    public void processNumber(int number) {
        Preconditions.checkArgument(number > 0, "Number must be positive: %s", number);
        // 進行處理邏輯
    }
    @Test
    public void testCheckArgumentTemplate() {
        processNumber(10);// 正常呼叫,引數符合條件
        processNumber(-5); // 丟擲IllegalArgumentException異常,引數不符合條件,異常訊息中包含具體的引數值
    }
}

在上述範例中,我們在checkArgument方法的第二個引數中使用了帶有預留位置的訊息模板:"Number must be positive: %s"。該預留位置%s表示在丟擲異常時會被具體的引數值替換。在呼叫processNumber方法時,如果傳遞的引數不滿足條件,將丟擲IllegalArgumentException異常,並在異常訊息中包含具體的引數值。

checkElementIndex

Preconditions類的checkElementIndex方法用於驗證索引是否包含在集合中,如果不包含,該方法將丟擲IndexOutOfBoundsException異常

   @Test
    public void testCheckElementIndex(){
        ArrayList<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("orange");

        int index = 3;
        Preconditions.checkElementIndex(index, list.size(), "Invalid index");

        String element = list.get(index);
        System.out.println("Element at index " + index + ": " + element);
    }

在本例中,我們使用集合的size作為集合的大小引數,並提供了錯誤訊息Invalid index。如果索引超出了集合的有效範圍,將丟擲異常並顯示錯誤訊息。
如果在範圍內,則使用list.get方法獲取指定索引的元素,並將其列印出來。

checkNotNull

checkNotNull方法檢查作為引數提供的值是否為 null。如果不為 null 則返回校驗後的值。如果傳遞給此方法的值為 null,則丟擲NullPointerException。
以下是一個範例,說明了checkNotNull方法的使用:

  @Test
    public void testCheckNotNull(){
        String name = "John Doe";
        Preconditions.checkNotNull(name, "Name cannot be null");
        System.out.println("Name: " + name);
    }

在此範例中,我們使用checkNotNull方法驗證字串name是否為null。如果name不為null,將繼續處理;如果name為null,將丟擲NullPointerException異常,並顯示錯誤訊息"Name cannot be null"。

checkState

Preconditions類的checkState方法用於驗證物件或程式的狀態是否符合預期。以下是一個範例,說明了checkState方法的使用:

  @Test
    public void testCheckState() {
        int[] validStates = {-1, 0, 1};
        int givenState = 8;
        String message = "You have entered an invalid state";
        Preconditions.checkState(Arrays.binarySearch(validStates, givenState) > 0, message);
    }

在此範例中,我們使用checkState方法驗證givenState是否包含在validStates陣列中。如果false,則丟擲IllegalStateException,並顯示資訊為You have entered an invalid state,否則繼續處理;

總結

在本教學中,我們演示了Guava庫中PreConditions類的各種方法。Preconditions類提供了靜態方法的集合,用於驗證引數是否有效。

程式碼地址:https://github.com/dongweizhao/guava-example