gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:03 26 4
gpt4 key购买 nike

我有一个带有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com