| `@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. |