Monday, January 9, 2017

Google AutoValue

在自定义类型中如

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