String expiryDate; private final int cvc; private final String nameOnCard; private Card(Builder builder) {} public String getNumber() {} public String getExpiryDate() {} public int getCvc() {} public String getNameOnCard() {} @Override public boolean equals(Object o) {} @Override public int hashCode() {} @Override public String toString() {} public static Builder builder() {} public Builder copy() {} public static final class Builder { private String number; private String expiryDate; private int cvc; private String nameOnCard; public Builder number(String val) {} public Builder expiryDate(String val) {} public Builder cvc(int val) {} public Builder nameOnCard(String val) {} public Card build() {} } } Some code How we used to write
public abstract String expiryDate(); public abstract int cvc(); public abstract String nameOnCard(); public abstract Builder copyBuilder(); public static Builder builder() {...} @AutoValue.Builder public abstract static class Builder { public abstract Builder number(String number); public abstract Builder expiryDate(String expiryDate); public abstract Builder cvc(int cvc); public abstract Builder nameOnCard(String nameOnCard); public abstract Card build(); } } @lombok.Value() @lombok.Builder(toBuilder = true) public class Card { private final String number; private final String expiryDate; private final int cvc; private final String nameOnCard; } Some code How we write now
annotations • AutoValue & Parcelable: watch out for non-parcelable fields • Lombok: all fields are nullable - must add @NonNull annotations • Immutability: watch out for collections (make a defensive copy in the builder)