当前位置:  开发笔记 > 编程语言 > 正文

是否可以在Java AutoValue中为集合添加值?

如何解决《是否可以在JavaAutoValue中为集合添加值?》经验,为你挑选了1个好方法。

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

例:

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

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



1> Kevin Bourri..:

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

一个功能是您可以定义一个抽象cardsBuilder()方法,该方法将启动相应集合类型的新构建器并将其返回给调用者.这是非常灵活的,但令人遗憾的是它"打破了链条".呼叫者现在正在拨打电话,ImmutableList.Builder无法回拨Deck.Builder电话build.

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

我相信这一切应该在1.1中有用,但如果您遇到麻烦请告诉我们!

PS我道歉 - 我们为AutoValue用户指南提供了很多新材料,包括这个主题,由于一些技术上的困难,这些材料一直被推到公共站点.


是否计划为com.google.common.collect构建器提供相同的功能,但是对于任何构建器?我希望为我生成的构建器使用相同的功能!
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有