AutoValue 的 構(gòu)建者
AutoValue的介紹 (簡(jiǎn)單翻譯)中已經(jīng)包含了基本的使用客情,使用靜態(tài)工廠作為你的公共API其弊。但是在大部分情況(such as those laid out in Effective Java, 2nd Edition Item 2),你可能更傾向于讓你的調(diào)用者使用一個(gè)構(gòu)建者生成實(shí)例對(duì)象膀斋。
幸運(yùn)的是梭伐,AutoValue可以也可以生成帶有構(gòu)建者的類。這一頁(yè)介紹了怎么做概页。但是我們還是建議你先閱讀并理解AutoValue的基本使用籽御,AutoValue的介紹 练慕。
怎么使用帶有構(gòu)建者的AutoValue
就像在介紹里面說(shuō)的那樣惰匙,AutoValue的概念就是寫一個(gè)抽象的value class,AutoValue實(shí)現(xiàn)它铃将。構(gòu)建者的生成也是一樣的方法:制造一個(gè)抽象的構(gòu)造者類项鬼,并把它包含在抽象類里面,然后AutoValue就會(huì)生成他們的實(shí)現(xiàn)劲阎。
在<code>Animal.java</code>中
import com.google.auto.value.AutoValue;
@AutoValue
abstract class Animal {
abstract String name();
abstract int numberOfLegs();
static Builder builder() {
return new AutoValue_Animal.Builder();
}
@AutoValue.Builder
abstract static class Builder {
abstract Builder name(String value);
abstract Builder numberOfLegs(int value);
abstract Animal build();
}
}
在實(shí)際應(yīng)用中绘盟,一些類和方法可能是public的并且?guī)в?strong>Javadoc,為了保證例子的簡(jiǎn)潔我們?nèi)サ袅诉@些悯仙。
使用
public void testAnimal() {
Animal dog = Animal.builder().name("dog").numberOfLegs(4).build();
assertEquals("dog", dog.name());
assertEquals(4, dog.numberOfLegs());
//You probably don't need to write assertions like; just illustrating.
assertTrue(Animal.builder().name("dog").numberogLegs(4).build().equals(dog));
assertFalse(Animal.builder().name("cat").numberogLegs(4).build().equals(dog));
assertFalse(Animal.builder().name("dog").numberogLegs(2).build().equals(dog));
assertEquals("Animal{name=dog, numberOfLegs=4}", dog.toString());
}
警告
確保把這個(gè)靜態(tài)<code>builder()</code>方法直接放在你的value class 內(nèi)部(e.g.,<code>Animal</code>)龄毡,而不是內(nèi)部抽象<code>Builder</code>類。確保這個(gè)<code>Animal</code>類在<code>Builder</code>之前初始化锡垄。否則你可能遇到初始化順序問(wèn)題沦零。
我怎么... ? 簡(jiǎn)單翻譯/ ? 原文
- ...使用(或不使用)<code>set</code>前綴?
- ...使用不同命名除了<code>builder()</code>/<code>Builder</code><code>build()</code>?
- ...為一個(gè)屬性制定默認(rèn)值货岭?
- ...使用一個(gè)現(xiàn)有的 value 實(shí)例的值初始化一個(gè)構(gòu)建者路操?
- ...在value class內(nèi)部包含<code>with-</code>方法,來(lái)生成一個(gè)略微修改的實(shí)例千贯?
- ...驗(yàn)證屬性的值屯仗?
- ...在構(gòu)建時(shí)正常化(修改)屬性的值搔谴?
- ...同時(shí)暴露構(gòu)造器和工廠方法魁袜?
- ...處理<code>Optional</code>屬性?
- ...使用一個(gè)集合屬性敦第?
- ...讓構(gòu)建者累積一個(gè)集合屬性的值(而不是一次全部給出)慌核?
- ...在不打破鏈?zhǔn)秸{(diào)用的前提下累積集合的值?
- ...對(duì)于同一個(gè)集合屬性提供設(shè)置值的兩種方式(一次性提供和累積提供)申尼?