这个意图改变了一个库方法契约。
方法约定的语法如下:
contract ::= (clause ';')* clause
clause ::= args '->' effect
args ::= ((arg ',')* arg )?
arg ::= value-constraint
value-constraint ::= '_' | 'null' | '!null' | 'false' | 'true'
effect ::= value-constraint | 'fail' | 'new' | 'this' | 'param' number
number ::= [1-9] [0-9]*
约束意味着:
-
_
: 任意值
-
null
:null 值
-
null!
:静态证明为非 null 的值
-
true
:布尔值 true
-
false
:布尔值 false
-
fail
:如果实参满足实参约束,该方法将抛出异常
-
new
:每次执行该方法时,它都会返回一个新的非 null 对象,该对象与方法执行前存在于堆中的其他对象不同。 如果方法是纯方法,则新对象不会存储在字段或数组中,如果不使用方法的返回值,则新对象将丢失。
-
this
:该方法返回非 null this 引用
-
param1 (param2, param3, etc.)
:该方法返回其第一个(第二个、第三个等)实参
示例:
-
@Contract("_, null -> null")
:如果方法的第二个实参为 null,它将返回 null。
-
@Contract("_, null -> null; _, !null -> !null")
- 如果方法的第二个实参为 null,它将返回 null,否则返回非 null。
-
@Contract("true -> fail")
- 一个典型的 assertFalse
方法,如果 true
被传递给它,它将抛出异常。