这个意图改变了一个库方法契约。
方法约定的语法如下:
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 被传递给它,它将抛出异常。