Annotation Type Memoized


  • @Documented
    @Retention(CLASS)
    @Target(METHOD)
    public @interface Memoized
    Annotates methods in @AutoValue classes for which the generated subclass will memoize the returned value.

    Methods annotated with @Memoized cannot:

    If you want to memoize Annotation.hashCode() or Annotation.toString(), you can redeclare them, keeping them abstract, and annotate them with @Memoized.

    If a @Memoized method is annotated with an annotation whose simple name is Nullable, then null values will also be memoized. Otherwise, if the method returns null, the overriding method will throw a NullPointerException.

    The overriding method uses double-checked locking to ensure that the annotated method is called at most once.

    Example

       @AutoValue
       abstract class Value {
         abstract String stringProperty();
    
         @Memoized
         String derivedProperty() {
           return someCalculationOn(stringProperty());
         }
       }
    
       @Generated
       class AutoValue_Value {
         // …
    
         private volatile String derivedProperty;
    
         Override
         String derivedProperty() {
           if (derivedProperty == null) {
             synchronized (this) {
               if (derivedProperty == null) {
                 derivedProperty = super.derivedProperty();
               }
             }
           }
           return derivedProperty;
         }
       }