用@AutoValue生成的类是不可变的吗?我可以使用它而不是自己创建类并确保它可以被注释为@Immutable吗?
AutoValue被宣传为"为Java 7+生成的不可变值类";。但是,如果使用可变字段,则AutoValue类不是@Immutable,也就是说,它不遵循注释javadoc中定义的约定。Autovalue文档中明确指出了这一点。
此外,如果您在AutoValue类中声明一个集合属性,如
public abstract Map<String, ImmutableThing> thingMap();
生成的字段不一定是不可变的,它取决于传递给构造函数的Map的实现。对于不变性,您希望使用类似于ImmutableMap的东西,它迫使您在构造函数中传递一个ImmutableMap:
public abstract ImmutableMap<String, ImmutableThing> thingMap();
在我看来,生成的AutoValue代码确实可以自动使这样的集合属性不可变。
我想@AutoValue的设计师们有充分的理由进行设计,但缺乏不变性令人惊讶。