IntelliJ IDEA怎么使用@Contract注釋

2018-10-19 14:47 更新

IntelliJ IDEA @Contract 注釋

IntelliJ IDEA中 @Contract 注釋通過(guò)定義方法參數(shù)和返回值之間的依賴關(guān)系,為您的代碼帶來(lái)更多的安全性。該信息為源代碼提供了更智能的控制流分析,并有助于避免可能出現(xiàn)的錯(cuò)誤。

@Contract 注釋是一個(gè)強(qiáng)大而靈活的工具,可以讓你的 API 的安全。此外,它不僅可以用于注釋自己的代碼,還可以用于其他現(xiàn)有的庫(kù)。

一旦為項(xiàng)目庫(kù)配置了注釋,IntelliJ IDEA 就會(huì)將注釋的信息存儲(chǔ)在簡(jiǎn)單的 XML 文件中,以便通過(guò)版本控制與團(tuán)隊(duì)共享。

若要啟用項(xiàng)目中的注釋,請(qǐng)通過(guò)項(xiàng)目結(jié)構(gòu)對(duì)話框?qū)?<IntelliJ IDEA Home>/lib/annotations.jar 添加到類路徑中。

@Contract 注釋的使用可以通過(guò)以下示例來(lái)說(shuō)明:

  • @Contract("_, null -> null") :如果方法的第二個(gè)參數(shù)是 null,方法返回 null。
  • @Contract("_, null -> null; _, !null -> !null"):如果方法的第二個(gè)參數(shù)是 null,則方法返回 null,否則為 null。
  • @Contract("true -> fail") :一個(gè)典型的 assertFalse () 方法,如果將 true 傳遞給它,則拋出一個(gè)異常。

@Contract 注釋的語(yǔ)法

該 @Contract 注釋值的語(yǔ)法如下:

  • contract ::= (clause ‘;’)* clause
  • clause ::= args ‘->’ effect
  • args ::= ((arg ‘,’)* arg )?
  • arg ::= value-constraint
  • value-constraint ::= ‘_’ | ‘null’ | ‘!null’ | ‘false’ | ‘true’
  • effect ::= value-constraint | ‘fail’

這里的約束是:

  • _ :任何價(jià)值
  • null:空值
  • !null: 一個(gè)靜態(tài)證明為不是空值
  • true:布爾值:真
  • false:布爾值:假
  • fail :如果參數(shù)滿足參數(shù)約束,該方法將拋出異常

@Contract 注釋的屬性

該 @Contract 注釋有兩個(gè)屬性: value 和 pure。

value 屬性包含描述調(diào)用參數(shù)和返回值之間的因果關(guān)系的 contract 子句。

pure 屬性適用于不更改其對(duì)象狀態(tài)的方法,但只返回一個(gè)新值。該屬性可以用作“忽略方法調(diào)用的結(jié)果”檢查的提示,以指示在調(diào)用時(shí)應(yīng)該使用方法的返回值。它是假(false)(默認(rèn)情況下),也可以為真(true)。

參考例子

請(qǐng)考慮以下代碼:

private static void printSorted(){
            List <Integer> sorted = Quicksort.sort(null);
            if (sorted != null){
                System.out.println("Sorted array" + sorted);
            }
}

public static <T extends Comparable<T>> List<T> sort(List<T> list){
        if(list != null){
            List<T> copy = new ArrayList<T>(list);
            sort(copy);
            return copy;
        }
        else {
            return null;
        }
}

IntelliJ IDEA 不知道 null 輸入產(chǎn)生一個(gè)空輸出。
我們用 @Contract 注釋來(lái)修飾 sort () 方法,指定 null 輸入產(chǎn)生 null 輸出。

IntelliJ IDEA @Contract 注釋的屬性

IntelliJ IDEA 立即認(rèn)識(shí)到該 if 聲明是無(wú)關(guān)緊要的,并報(bào)告的條件總是錯(cuò)誤的:

IntelliJ IDEA @Contract 注釋的屬性

IntelliJ IDEA 有用的提示

IntelliJ IDEA 建議庫(kù)類的方法的兩個(gè)意圖操作:

  • 添加方法協(xié)定 /編輯方法協(xié)定:
    IntelliJ IDEA 有用的提示
  • 這兩種意圖都有可能設(shè)置:pure = true:
    IntelliJ IDEA 有用的提示
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)