/**
* 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 @interface AutoValue {
/**
* 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 @interface Builder {}
/**
* 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 @interface CopyAnnotations {
Class<? extends Annotation>[] exclude() default {};
}
}
@AutoValue
public abstract class Product {
public abstract String name();
public abstract BigDecimal price();
@AutoValue.Builder
public abstract static class Builder{
public abstract Builder name(String name);
public abstract Builder price(BigDecimal price);
public abstract Product build();
}
public static Product.Builder builder(){
return new AutoValue_Product.Builder();
}
}
@AutoValue
public abstract class Product {
public abstract String name();
public abstract BigDecimal price();
@AutoValue.Builder
public abstract static class Builder{
public abstract Builder name(String name);
public abstract Builder price(BigDecimal price);
public abstract Product build();
}
public static Product.Builder builder(){
return new AutoValue_Product.Builder();
}
}