java - 是否可以在 Java AutoValue 中向集合添加值?

标签 java auto-value

我有一个带有 List 属性的 Java AutoValue 类。我想允许构建器附加到列表而不是必须传递整个构建的列表。

例子:

import com.google.auto.value.AutoValue;
@AutoValue
public abstract class Deck {
    public abstract List<Card> cards();
    public static Builder builder() {
        return new AutoValue_Card.Builder()
            .cards(new ArrayList<Card>());
    }
    @AutoValue.Builder
    public abstract static class Builder {
        public abstract Builder cards(List<Card> cards);
        /**
         * Append card to cards in the constructed Deck.
         */
        public Builder addCard(Card card) {
            // Is it possible to write this function?
        }
    }
}

编写 addCard 函数的最佳解决方案是什么? AutoValue 是否已经以某种方式支持这一点?构造类中的中间卡属性对 Builder 不可见,因此我无法直接访问它。我可以通过在生成器中保留我自己的卡片副本来尝试直接绕过生成器,这是这里唯一的选择吗?

最佳答案

当您使用 Guava 的 immutable collections 时,AutoValue 有一些特殊功能会发挥作用。 ,因为这些集合都有自己关联的构建器类型。 (当然,您当然希望值类的属性是不可变的!)

一个特性是您可以定义一个抽象的 cardsBuilder() 方法,该方法将启动一个适当集合类型的新构建器并将其返回给调用者。这是 super 灵活的,但令人遗憾的是它“打破了链条”。调用者现在正在调用 ImmutableList.Builder,无法返回到 Deck.Builder 来调用 build

但是您可以通过添加自己的 addCard 方法来解决这个问题,就像您在上面展示的那样,只需实现它来调用 cardsBuilder().add(card) 然后返回 this 而不是构建器。问题解决了!

我相信所有这些都应该在 1.1 中起作用,但如果您遇到问题,请告诉我们!

附言抱歉 - 我们有很多关于 AutoValue 用户指南的新 Material ,包括这个主题,由于一些技术困难,这些 Material 一直无法发布到公共(public)站点。

关于java - 是否可以在 Java AutoValue 中向集合添加值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233862/

相关文章:

Java移动跨平台框架

java - 用行间距格式化乘法表

java - 将 JDBI @BindBean 与 AutoValue 结合使用

java - 如何使用泛型创建 AutoValue 类?

java - 使用带有扩展名的自动值时,AutoValue : Missing required properties,

java - 使用递归的 O(n^2) 的最大递增子序列

java - 在 guice 中,@provides 和 bind() 之间有区别吗?

Java SSL 握手失败 - 没有客户端证书

java - Google AutoValue 无法识别 AutoValue_CustomType

java - @AutoValue - "cannot find symbol class Generated"错误