이 인텐션은 라이브러리 메서드 컨트랙트를 변경합니다.
메서드 컨트랙트는 다음과 같은 구조를 갖습니다.
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") - true가 전달되면 예외를 던지는 전형적인 assertFalse 메서드