这个意图改变了一个库方法契约。
方法约定的语法如下:
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 等) - 该方法返回其第一个(第二个、第三个等)参数
示例:
@Contract("_, null -> null")
- 方法的第二个参数为 null,则返回 null
@Contract("_, null -> null; _, !null -> !null")
- 方法的第二个参数为 null,则返回 null,否则返回非 null。
@Contract("true -> fail")
- 一个典型的 assertFalse 方法,如果 true
被传递给它,它会抛出一个异常。