我需要@AutoValue 类中的不可变集合吗?

问题描述

@Autovalue 生成的类是不可变的吗?我可以使用它而不是自己创建类并确保它可以被@Immutable 注释吗?

解决方法

AutoValue 被宣传为“为 Java 7+ 生成的不可变值类”。但是如果使用可变字段,AutoValue类就不是@Immutable,即不遵循annotation javadoc中定义的契约。 Autovalue docs 中明确指出了这一点。

此外,如果您在 AutoValue 类中声明一个集合属性,例如

    public abstract Map<String,ImmutableThing> thingMap();

结果字段不一定是不可变的,这取决于您传递给构造函数的 Map 的实现。对于不变性,您想改用 ImmutableMap 之类的东西,这会强制您在构造函数中传入 ImmutableMap:

    public abstract ImmutableMap<String,ImmutableThing> thingMap();

在我看来,生成的 AutoValue 代码确实可以自动使集合属性像这样不可变。

我想@AutoValue 设计者的设计有很好的理由,但缺乏不变性令人惊讶。