Package groovy.contracts
Annotation Interface Requires
@Documented
@Retention(RUNTIME)
@Target({CONSTRUCTOR,METHOD})
@Precondition
@AnnotationProcessorImplementation(RequiresAnnotationProcessor.class)
@Repeatable(RequiresConditions.class)
public @interface Requires
Represents a method precondition.
A precondition is a condition that must be met by clients of this class. Whenever the precondition can be satisfied, it is guaranteed that the supplier will fulfil the method's postcondition.
A method's precondition is executed as the first statement within a method call. A successor's precondition weakens the precondition of its parent class, e.g. if A.someMethod declares a precondition and B.someMethod overrides the method the preconditions are combined with a boolean OR.
Example:
@Requires({ argument1 != argument2 && argument2 >= 0 })
void someOperation(def argument1, def argument2) {
...
}
- Since:
- 4.0.0
-
Required Element Summary
Required Elements -
Optional Element Summary
Optional ElementsModifier and TypeOptional ElementDescriptionbooleanInformation for readers and tools, with no effect on bytecode; ignored (implicitlytrue) for woven preconditions.booleantrue(default): weave the precondition assertion — the current behaviour, a violating caller observes aPreconditionViolation.
-
Element Details
-
value
Class valueReturns the closure class that evaluates the precondition expression.- Returns:
- the generated closure class backing the precondition
-
-
-
woven
boolean woventrue(default): weave the precondition assertion — the current behaviour, a violating caller observes aPreconditionViolation.false: the obligation is already enforced (seedirectfor where) — no assertion is generated, and a violating caller observes whatever the existing enforcement does (for example theNullPointerExceptionof anObjects.requireNonNull) rather than aPreconditionViolation. The annotation remains the caller's documented obligation, consumable by readers and tools (verifiers discharge it at call sites regardless of where enforcement lives). An unwoven precondition never contributes to generated assertions — including the inherited precondition weaving of overriding methods.- Returns:
- whether the precondition assertion is generated
- Since:
- 6.0.0
- Default:
- true
-
direct
boolean directInformation for readers and tools, with no effect on bytecode; ignored (implicitlytrue) for woven preconditions.true(default): a hand-written check enforces the obligation in this body.false: the obligation is enforced by code this method executes — a validator call such asObjects.requireNonNullor Guava'sPreconditions, possibly transitively — so there is no check to find in this body. Most users never set this; a verification or analysis tool unable to find the claimed enforcement is the usual prompt.- Returns:
- whether the body itself contains the enforcement
- Since:
- 6.0.0
- Default:
- true
-