/** * Specifies that <a href="https://github.com/google/auto/tree/master/value">AutoValue</a> should * generate an implementation class for the annotated abstract class, implementing the standard * {@link Object} methods like {@link Object#equals equals} to have conventional value semantics. A * simple example: <pre> * * @AutoValue * abstract class Person { * static Person create(String name, int id) { * return new AutoValue_Person(name, id); * } * * abstract String name(); * abstract int id(); * }</pre> * * @see <a href="https://github.com/google/auto/tree/master/value">AutoValue User's Guide</a> * * @author Éamonn McManus * @author Kevin Bourrillion */@Retention(RetentionPolicy.CLASS)@Target(ElementType.TYPE)public @interfaceAutoValue {/** * Specifies that AutoValue should generate an implementation of the annotated class or interface, * to serve as a <i>builder</i> for the value-type class it is nested within. As a simple example, * here is an alternative way to write the {@code Person} class mentioned in the {@link AutoValue} * example: <pre> * * @AutoValue * abstract class Person { * static Builder builder() { * return new AutoValue_Person.Builder(); * } * * abstract String name(); * abstract int id(); * * @AutoValue.Builder * interface Builder { * Builder name(String x); * Builder id(int x); * Person build(); * } * }</pre> * * @author Éamonn McManus */ @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE)public @interfaceBuilder {}/** * Specifies that AutoValue should copy any annotations from the annotated element to the * generated class. This annotation supports classes and methods. * * <p>The following annotations are excluded: * * <ol> * <li>AutoValue and its nested annotations; * <li>any annotation appearing in the {@link AutoValue.CopyAnnotations#exclude} field; * <li>any class annotation which is itself annotated with the * {@link java.lang.annotation.Inherited} meta-annotation. * </ol> * * <p>When the <i>type</i> of an {@code @AutoValue} property method has annotations, those are * part of the type, so they are always copied to the implementation of the method. * {@code @CopyAnnotations} has no effect here. For example, suppose {@code @Confidential} is a * {@link java.lang.annotation.ElementType#TYPE_USE TYPE_USE} annotation: <pre> * * @AutoValue * abstract class Person { * static Person create(@Confidential String name, int id) { * return new AutoValue_Person(name, id); * } * * abstract @Confidential String name(); * abstract int id(); * }</pre> * * Then the implementation of the {@code name()} method will also have return type * {@code @Confidential String}. * * @author Carmi Grushko */ @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE,ElementType.METHOD})public @interfaceCopyAnnotations {Class<? extends Annotation>[] exclude()default {}; }}
다음과 같이 Product 클래스를 builder로 생성하면, AutoValue_Product 인스턴스로 생성된 것을 볼 수 있다. AutoValue는 불변정보(Immutable)를 전달하는 클래스 인스턴스를 생성할때 사용할 수 있다. AutoValue_Product를 보면 final 클래스이면서 변수도 final 인 것을 볼 수 있다. 그러므로, AutoValue는 멤버 변수 값이 항상 바뀔 수 있는 인스턴스에서는 사용하면 안된다.