Annotation Type Memoized


@Documented @Retention(SOURCE) @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 @Memoize.

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;
     }
   }