@AutoValue classes are intended to be closed, with a single implementation with known semantics. Implementing them by hand is extremely dangerous.

Here are some common cases where we have seen code that extends @AutoValue classes and recommendations for what to do instead:

  • Overriding the getters to return given values. This should usually be replaced by creating an instance of the @AutoValue class with those values.

  • Having the @AutoValue.Builder class extend the @AutoValue class so it inherits the abstract getters. This is wrong since the Builder doesn't satisfy the contract of its superclass and is better implemented either by repeating the methods or by having both the @AutoValue class and the Builder implement a common interface with these getters.

  • In other cases of extending the @AutoValue class and implementing its abstract methods, it would be more correct to have the @AutoValue class and the other class have a common supertype.