cache constrained-ness of executable parameters/return values
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ExecutableD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ExecutableD.java
index eab7a9a..4a73771 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ExecutableD.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ExecutableD.java
@@ -33,6 +33,8 @@
     private final ReturnValueD<SELF, E> returnValue;
     private final List<ParameterD<SELF>> parameters;
     private final CrossParameterD<SELF, E> crossParameter;
+    private final boolean parametersAreConstrained;
+    private final boolean returnValueIsConstrained;
 
     @SuppressWarnings("unchecked")
     protected ExecutableD(R reader, BeanD<?> parent) {
@@ -43,6 +45,8 @@
         returnValue = reader.getReturnValueDescriptor((SELF) this);
         parameters = reader.getParameterDescriptors((SELF) this);
         crossParameter = reader.getCrossParameterDescriptor((SELF) this);
+        parametersAreConstrained = parameters.stream().anyMatch(DescriptorManager::isConstrained) || crossParameter.hasConstraints();
+        returnValueIsConstrained = DescriptorManager.isConstrained(returnValue);
     }
 
     @Override
@@ -68,11 +72,11 @@
 
     @Override
     public final boolean hasConstrainedParameters() {
-        return parameters.stream().anyMatch(DescriptorManager::isConstrained) || getCrossParameterDescriptor().hasConstraints();
+        return parametersAreConstrained;
     }
 
     @Override
     public final boolean hasConstrainedReturnValue() {
-        return DescriptorManager.isConstrained(returnValue);
+        return returnValueIsConstrained;
     }
 }