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