我有一个带有List属性的Java AutoValue类.我想允许构建器附加到List而不必传递整个构造的列表.
例:
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?
}
}
}
Run Code Online (Sandbox Code Playgroud)
编写addCard函数的最佳解决方案是什么?AutoValue是否已经以某种方式支持此功能?构造类中的中间卡属性对Builder不可见,因此我无法直接访问它.我可以尝试通过在Builder中保留我自己的卡副本来直接绕过Builder,这是唯一的选择吗?
当您使用Guava的不可变集合时,AutoValue具有一些特殊功能,因为这些集合都有自己的关联构建器类型.(当然,你当然希望你的值类的属性是不可变的!)
一个功能是您可以定义一个抽象cardsBuilder()方法,该方法将启动相应集合类型的新构建器并将其返回给调用者.这是非常灵活的,但令人遗憾的是它"打破了链条".呼叫者现在正在拨打电话,ImmutableList.Builder无法回拨Deck.Builder电话build.
但是你可以通过添加自己的addCard方法解决这个问题,就像你在上面展示的那样,然后实现它来调用cardsBuilder().add(card)然后返回this而不是构建器.问题解决了!
我相信这一切应该在1.1中有用,但如果您遇到麻烦请告诉我们!
PS我道歉 - 我们为AutoValue用户指南提供了很多新材料,包括这个主题,由于一些技术上的困难,这些材料一直被推到公共站点.
如果有人发现它有用 - 这是我认为凯文建议的实际代码。当我第一次偶然发现他的回复时,这并不明显,所以你看:
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
@AutoValue
public abstract class Hand {
public static Builder builder() {
return new AutoValue_Hand.Builder();
}
public abstract Builder toBuilder();
public abstract String name();
public abstract ImmutableList<String> cards();
@AutoValue.Builder
public static abstract class Builder {
public abstract Builder name(String name);
protected abstract ImmutableList.Builder<String> cardsBuilder();
public Builder addCard(String card) {
cardsBuilder().add(card);
return this;
}
public abstract Hand build();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
Hand fullHouseHand = Hand.builder()
.name("Full House")
.addCard("King")
.addCard("King")
.addCard("King")
.addCard("10")
.addCard("10")
.build();
System.out.print(fullHouseHand);
Run Code Online (Sandbox Code Playgroud)
输出:
Hand{name=Full House, cards=[King, King, King, 10, 10]}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |