此引數和接收器引數的註釋

首次引入 Java 註釋時,沒有為內部類建構函式註釋例項方法的目標或隱藏的建構函式引數。這在 Java 8 中通過新增接收器引數宣告得到了補救 ; 見 JLS 8.4.1

receiver 引數是例項方法或內部類建構函式的可選語法裝置。對於例項方法,receiver 參數列示呼叫該方法的物件。對於內部類的建構函式,receiver 參數列示新構造的物件的直接封閉例項。無論哪種方式,接收器引數僅存在以允許在原始碼中表示所表示的物件的型別,從而可以註釋該型別。接收器引數不是形式引數; 更確切地說,它不是任何型別變數的宣告(§4.12.3),它永遠不會繫結到在方法呼叫表示式或限定類例項建立表示式中作為引數傳遞的任何值,並且它在任何情況下都沒有任何影響執行。

以下示例說明了兩種接收器引數的語法:

public class Outer {
    public class Inner {
        public Inner (Outer this) {
           // ...
        }
        public void doIt(Inner this) {
           // ...
        }
    }
}

接收器引數的唯一目的是允許你新增註釋。例如,你可能有一個自定義註釋 @IsOpen,其目的是斷言在呼叫方法時 Closeable 物件尚未關閉。例如:

public class MyResource extends Closeable {
    public void update(@IsOpen MyResource this, int value) {
        // ...
    }

    public void close() {
        // ...
    }
}

在一個層面上,this 上的 @IsOpen 註釋可以簡單地作為文件。但是,我們可能會做得更多。例如:

  • 當呼叫 update 時,註釋處理器可以插入 this 未處於關閉狀態的執行時檢查。
  • 程式碼檢查器可以執行靜態程式碼分析,以查詢在呼叫 update可以關閉 this 的情況。