| import com.google.auto.value.AutoValue; |
| import java.util.Optional; |
| import org.checkerframework.checker.calledmethods.qual.*; |
| import org.checkerframework.checker.nullness.qual.*; |
| |
| /** |
| * Adapted from the standard AutoValue example code: |
| * https://github.com/google/auto/blob/master/value/userguide/builders.md |
| */ |
| @AutoValue |
| abstract class Animal { |
| abstract String name(); |
| |
| abstract @Nullable String habitat(); |
| |
| abstract int numberOfLegs(); |
| |
| // does not need to be explicitly set |
| abstract Optional<String> extra(); |
| |
| public String getStr() { |
| return "str"; |
| } |
| |
| public abstract Builder toBuilder(); |
| |
| static Builder builder() { |
| return new AutoValue_Animal.Builder(); |
| } |
| |
| @AutoValue.Builder |
| abstract static class Builder { |
| |
| abstract Builder setName(String value); |
| |
| abstract Builder setNumberOfLegs(int value); |
| |
| abstract Builder setHabitat(String value); |
| |
| abstract Builder setExtra(String value); |
| |
| abstract Animal build(); |
| } |
| |
| public static void buildSomethingWrong() { |
| Builder b = builder(); |
| b.setName("Frank"); |
| // :: error: finalizer.invocation |
| b.build(); |
| } |
| |
| public static void buildSomethingRight() { |
| Builder b = builder(); |
| b.setName("Frank"); |
| b.setNumberOfLegs(4); |
| b.build(); |
| } |
| |
| public static void buildSomethingRightIncludeOptional() { |
| Builder b = builder(); |
| b.setName("Frank"); |
| b.setNumberOfLegs(4); |
| b.setHabitat("jungle"); |
| b.build(); |
| } |
| |
| public static void buildSomethingWrongFluent() { |
| // :: error: finalizer.invocation |
| builder().setName("Frank").build(); |
| } |
| |
| public static void buildSomethingRightFluent() { |
| builder().setName("Jim").setNumberOfLegs(7).build(); |
| } |
| |
| public static void buildWithToBuilder() { |
| Animal a1 = builder().setName("Jim").setNumberOfLegs(7).build(); |
| a1.toBuilder().build(); |
| } |
| |
| public static void buildSomethingRightFluentWithLocal() { |
| Builder b = builder(); |
| b.setName("Jim").setNumberOfLegs(7); |
| b.build(); |
| } |
| } |