public class Money {
public Currency currency;
public long amount;
}
我们希望currency和amount相等的情况下,Money应该一样,且Money不能变。这时,我们要写很多代码去实现hashCode和equals以及toString,还要声明currency和amount为final。这是重复性工作,AutoValue可以帮你自动生成这些代码,使用如下:
@AutoValue
public abstract class Animal {
abstract String name();
abstract int numberOfLegs();
@Nullable
abstract String category();
private String derivedName;
public static Builder builder() {
return new AutoValue_Animal.Builder();
}
public final String drivedName(){
return category() + ":" + name();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setName(String value);
public abstract Builder setNumberOfLegs(int value);
public abstract Animal build();
}
}
AutoValue只有在新建类的时候设定值,之后不能再改变,只能get,这叫immutable object。category设置nullable可以不出现在builder中,否则会报错。derived域不用abstract。
Animal dog = Animal.builder().setName("dog").setNumberOfLegs(4).build();
Animal cat = Animal.builder().setName("cat").setNumberOfLegs(4).setCategory("mammal").build();
Eclipse设置
这个用注解生成代码的方法叫annotation processing. 需要在eclipse中做改动:1. 有4个jar加入到Java Build path->Libraries中:
auto-service-1.0-rc1.jar
guava-16.0.1.jar
jsr305-2.0.3.jar
auto-value-1.1.jar (不能用1.0版本)
2. enable annotation processing表示生成java文件的文件夹叫generated(任意名)
3. Factory path中加入4个jar包
4. 把generated文件夹加入到Java Build Path->Source中,项目就可以加入自动生成java一起编译
这样写代码(Animal.java)保存可生成AutoValue_Animal.java
ref:
Official website
原理讲解
No comments:
Post a Comment