我如何子类化AutoValue类?

时间:2016-09-30 18:35:21

标签: java android auto-value

我正在使用AutoValue扩展来生成我的Parcelable Android类。该文档明确指出一个@AutoValue不能扩展另一个: https://github.com/google/auto/blob/master/value/userguide/howto.md#inherit

另一位开发人员正在帮我解决这个问题,并建议“如果你有共同的字段,你可以将它们放在两个实现都实现的接口中。”我假设这意味着图书馆更喜欢构图而不是继承。

我承认,我有点迷茫。如果有人可以提供一个简单的“子类化”AutoValue类的简单方法的例子,那将是值得赞赏的。这是一个简单的课程:

@AutoParcelGson
public abstract class User implements Parcelable {

    public abstract String username();
    public static User create(String username) {
        return builder().username(username).build();
    }

    public static Builder builder() {
        return new AutoParcelGson_User.Builder();
    }

    @AutoParcelGson.Builder
    public interface Builder {
        Builder username(String username);
        User build();
    }
}

我想要另一个名为Customer的@AutoValue类,它有一些额外的字段。此外,@ AutoParcelGson是我正在使用的@AutoValue扩展,但它是相同的行为。

2 个答案:

答案 0 :(得分:0)

documentation of AutoValue说:«故意不支持此能力,因为没有正确的方法。参见《有效Java,第二版》第8项:“在重载等于时遵守总契约。”»一本好书,我学到了很多东西。在第三版中,该项目为10。简而言之:假设您将User类扩展了BetterUser。在某些情况下BetterUser betterUser.equals(User user)可能是正确的,但在这些情况下user.equals(betterUser)未定义。违反对称性。那只是问题之一;您尝试的次数越多,情况就越糟。顺便说一句,这不是特定于AutoValue类,而是一个普遍的继承问题。

唯一一致的解决方案是制作一个新类BetterUser,该类不扩展User但具有类型User的字段。这样,您可以根据需要定义BetterUser的行为,而不会影响其他类。或者,如果User只有几个字段,则只需复制并粘贴代码。

答案 1 :(得分:0)

这是一个工作代码示例。就我而言,该测试将打印ModelMapper

{"newString":"foobar","myInt":1,"myString":"asdf"}