IntelliJ IDEA 2020.1ヘルプ

@Contract

@Contract 注釈は、メソッドが満たす必要がある契約を定義するために使用されます。これにより、注釈を付けたメソッドを呼び出すメソッドでIDEが問題を見つけることができます。この注釈は、独自のコードに注釈を付けるだけでなく、他の既存のライブラリにも使用できます。

@Contract 注釈は2つの属性 - valuepureを持ちます。 value 属性には、引数と戻り値の間の因果関係を記述する句が含まれています。

pure 属性は、オブジェクトの状態を変更せずに新しい値を返すメソッドを対象としています。その戻り値が使用されない場合、メソッド呼び出しが例外をスローしない限り(例外は副作用とはみなされない限り)、呼び出しを除去してもプログラムの状態に影響を与えたり、セマンティクスを変更することはありません。

メソッド自体に副作用が発生しない場合は、そのメソッドを pure なメソッドとしてマークすべきではありませんが、別のスレッドのイベント間で発生前の関係を確立するために使用できるため、このメソッドの呼び出し後に別のスレッドで実行された変更が現在のスレッドで見えるようになります。一方、ここでの同期化の目的は、別のスレッドのイベントを待つのではなく、コレクションの内部整合性を維持することであるため、一部の同期化メソッドは pure としてマークされます。プログラムの重要なセマンティクスに影響しない "見えない" 副作用 (ログなど) は許されます。

契約とは、入力と出力を記述する句の集合で、"A -> B"のように -> シンボルで区切られています。これは、Aをメソッドに提供するとBを得るという意味での契約を形成します。契約内の句は、; (セミコロン)記号で区切らなければなりません。例:

@Contract("_, null -> null")

2番目の引数が nullの場合、このメソッドは null を返します。

@Contract("_, null -> null; _, !null -> !null")

このメソッドは、2番目の引数が nullの場合は null を返し、そうでない場合はnullになりません。

@Contract("true -> fail")

true が渡された場合に例外をスローする典型的な assertFalse() メソッド。

@Contract("_ -> this")

このメソッドは常にその修飾子(たとえば StringBuilder.append)を返します。

@Contract("null -> fail; _ -> param1")

最初の引数がnullの場合、このメソッドは例外をスローします。それ以外の場合は、最初の引数を返します(たとえば、Objects.requireNonNull)。

@Contract("!null, _ -> param1; null, !null -> param2; null, null -> fail")

このメソッドは最初のNULL以外の引数を返すか、または両方の引数がNULLの場合は例外をスローします(たとえば、Java 9の Objects.requireNonNullElse )。

契約を定義する

  1. メソッドで Alt+Enter を押し、メソッド規約を追加するまたはメソッド規約を編集するを選択します。

  2. 契約を設定し、変更を適用します。

    contract annotation lib1

構文

@Contract 注釈値の構文は次のとおりです。

contract ::= (clause ‘;’)* clause
clause ::= args ‘->’ effect
args ::= ((arg ‘,’)* arg )?
arg ::= value-constraint
value-constraint ::= ‘_’ | ‘null’ | ‘!null’ | ‘false’ | ‘true’
effect ::= ‘_’ | ‘null’ | ‘!null’ | ‘false’ | ‘true’ | ‘fail’ | ‘new’ | ‘this’ | ‘param’ number
number ::= [1-9] [0-9]*

制約は次のとおりです。

_

任意の値

null

null 値

!null

nullでないことが静的に証明された値

true

真のブール値

false

偽のブール値

fail

引数が引数の制約を満たす場合、このメソッドは例外をスローします。

new

メソッドが実行されるたびに、メソッド実行前にヒープ内に存在する他のオブジェクトとは異なる非nullの新しいオブジェクトが返されます。メソッドが純粋な場合、新しいオブジェクトはどのフィールドまたは配列にも格納されず、メソッドの戻り値が使用されない場合は失われます。

this

このメソッドはnull以外の this 参照を返します

param1 (param2, param3, and so on)

メソッドは最初の(2番目、3番目など)引数を返します

最終更新日: 2020年6月2日