NYCAndroidMeetup AutoValueExtensions ForExport PDF
NYCAndroidMeetup AutoValueExtensions ForExport PDF
Jake Wharton
Value Types?
Value Types?
Everything is mutable in Java.
Value Types?
Basically everything is mutable in Java.
Value Types?
Basically everything is mutable in Java.
Collections
Value Types?
Basically everything is mutable in Java.
Collections
Arrays
Value Types?
Basically everything is mutable in Java.
Collections
Arrays
Mutator methods
Value Types?
Basically everything is mutable in Java.
Collections
Arrays
Mutator methods
Non-scalar "constants"
Value Types
public class Payment {
public long id();
public long amount();
public String note();
}X
Value Types
public final class Payment {
public long id();
public long amount();
public String note();
}X
Value Types
public final class Payment {
private final long id;
Constructor Parameter
Constructor Statement
}Y
return id; 3
public long amount() {
return amount;
}Z
Method Signature
public Currency currency() {
}U
return currency;
4
public String note() {
return note;
}W
}E
equals() Expression
return id == other.id
&& amount == other.amount
&& currency.equals(other.currency)
&& note.equals(other.note);
7
}R
hashCode() Expression
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (int) (amount ^ (amount >>> 32));
result = 31 * result + currency.hashCode();
result = 31 * result + note.hashCode();
8
return result;
}T
}X
Value Types
public final class Payment {
private final long id;
private final long amount;
private final Currency currency;
private final String note;
Value Types
private final Currency currency;
private final String note;
public Payment(long id, long amount, Currency currency, String note) {
this.id = id;
this.amount = amount;
this.currency = currency;
this.note = note;
}Q
public long id() {
AutoValue!
private final Currency currency;
private final String note;
AutoValue_Payment(long id, long amount, Currency currency, String note) {
this.id = id;
this.amount = amount;
this.currency = currency;
this.note = note;
}Q
@Override public long id() {
@AutoValue return id;
public abstract class Payment { }Y
@Override public long amount() {
return amount;
public static Payment create( }Z
long id, long amount, Currency currency, String note) { @Override public Currency currency() {
return new AutoValue_Payment(id, amount, currency, note); return currency;
}U
}Z @Override public String note() {
return note;
public abstract long id(); }W
public abstract long amount();
@Override public String toString() {
public abstract Currency currency(); return "Payment{" +
public abstract String note(); "id=" + id +
}X ", amount=" + amount +
", currency=" + currency +
", note='" + note + '\'' +
'}';
}E
@Override public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Payment)) return false;
Payment other = (Payment) o;
return id == other.id
&& amount == other.amount
&& currency.equals(other.currency)
&& note.equals(other.note);
}R
@Override public int hashCode() {
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (int) (amount ^ (amount >>> 32));
result = 31 * result + currency.hashCode();
result = 31 * result + note.hashCode();
return result;
}T
}X
AutoValue!
github.com/google/auto
AutoValue Extensions
@AutoValue
public abstract class Payment {
public abstract long id();
public abstract long amount();
public abstract Currency currency();
public abstract String note();
}X
AutoValue Extensions
@AutoValue
public abstract class Payment {
public abstract long id();
public abstract long amount();
public abstract Currency currency();
public abstract String note();
}X
Parcelable
Ok, awesome! Now how do I use it with Gson ?
Cursors
AutoValue Extensions
@AutoValue
public abstract class Payment {
public abstract long id();
public abstract long amount();
public abstract Currency currency();
public abstract String note();
}X
Parcelable
Gson
Ok, awesome! Now how do I use it with Cursors ?
(whatever)
AutoValue Extensions
@AutoValue
public abstract class Payment {
public abstract long id();
public abstract long amount();
public abstract Currency currency();
public abstract String note();
}X Parcelable
Gson
Cursors
Ok, awesome! Now how do I use it with (whatever) ?
AutoValue Extensions
@AutoValue
public abstract class Payment3{
public abstract long id();
public abstract long amount();
public abstract Currency currency();
public abstract String note();
}X
AutoValue Extensions
@AutoValue
public abstract class Payment1implements2Parcelable3{3
public abstract long id();
public abstract long amount();
public abstract Currency currency();
public abstract String note();
}X/* abstract properties */
AutoValue Extensions
final class AutoValue_Payment1extends2Payment {
/* value type implementation */
}Y
@AutoValue
public abstract class Payment1implements2Parcelable3{3
/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
AutoValue Extensions
@AutoValue
final class AutoValue_Payment1extends2$AutoValue_Payment {
public
/* parcelable
abstract class
implementation
Payment1implements2Parcelable3{3
*/
}Zpublic abstract long id();
public
/* abstract
abstract
properties
long amount();
*/
abstract
public abstract
class $AutoValue_Payment1extends2Payment
Currency currency(); {
public
/* value
abstract
type implementation
String note();
*/
}Y/* abstract properties */
}X
AutoValue Extensions
@AutoValue
final class AutoValue_Payment1extends2$AutoValue_Payment {
public
/* parcelable
abstract class
implementation
Payment1implements2Parcelable3{3
*/
}Zpublic abstract long id();
public
/* abstract
abstract
properties
long amount();
*/
abstract
public abstract
class $AutoValue_Payment1extends2Payment
Currency currency(); {
@Redacted
/* value type
public
implementation
abstract String
*/ note();
}Y/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
AutoValue Extensions
final class AutoValue_Payment1extends2$AutoValue_Payment {
/* parcelable implementation */
}Z
@AutoValue
public abstract class Payment1implements2Parcelable {
/* abstract properties */
}X
Available Extensions
Available Extensions
Parcelable: github.com/rharter/auto-value-parcel
Redacted: github.com/square/auto-value-redacted
Gson: github.com/rharter/auto-value-gson
Moshi: github.com/rharter/auto-value-moshi
Cursor: github.com/gabrielittner/auto-value-cursor
"with"ers: github.com/gabrielittner/auto-value-with
Extension API
Extension API
public abstract class AutoValueExtension {
public boolean applicable(Context context) {
return false;
}
@AutoValue
Parcelable extension public abstract class Payment {}
Extension API
public boolean applicable(Context context)
@AutoValue
Parcelable extension public abstract class Payment {} false
Extension API
public boolean applicable(Context context)
@AutoValue
Parcelable extension public abstract class Payment {} false
@AutoValue
Parcelable extension public abstract class Payment implements Parcelable {}
Extension API
public boolean applicable(Context context)
@AutoValue
Parcelable extension public abstract class Payment {} false
@AutoValue
Parcelable extension public abstract class Payment implements Parcelable {} true
Extension API
public boolean applicable(Context context)
@AutoValue
Parcelable extension public abstract class Payment {} false
@AutoValue
Parcelable extension public abstract class Payment implements Parcelable {} true
@AutoValue
@AutoValue
Parcelable extension public abstract class Payment {} false
@AutoValue
Parcelable extension public abstract class Payment implements Parcelable {} true
@AutoValue
@AutoValue
Parcelable extension public abstract class Payment {} false
@AutoValue
Parcelable extension public abstract class Payment implements Parcelable {} true
@AutoValue
@AutoValue
@AutoValue
Parcelable extension public abstract class Payment {} false
@AutoValue
Parcelable extension public abstract class Payment implements Parcelable {} true
@AutoValue
@AutoValue
false true
Extension API
public boolean applicable(Context context)
false true
false true
Extension API
public boolean mustBeFinal(Context context)
false true
@AutoValue @AutoValue
public abstract class Payment1{3 public abstract class Payment1{3
/* abstract properties */ /* abstract properties */
}X }X
Extension API
public boolean mustBeFinal(Context context)
false true
@AutoValue @AutoValue
public abstract class Payment1{3 public abstract class Payment1{3
/* abstract properties */ /* abstract properties */
}X }X
Extension API
public abstract class AutoValueExtension {
public boolean applicable(Context context) {
return false;
}
@AutoValue
public abstract class Payment implements Parcelable {
public abstract String note();
}
Extension API
public Set<String> consumeProperties(Context context)
@AutoValue
public abstract class Payment implements Parcelable {
public abstract String note();
}
Extension []
Extension API
public Set<String> consumeProperties(Context context)
@AutoValue
public abstract class Payment implements Parcelable {
public abstract String note();
}
Extension []
[ "note", "describeContents" ]
Extension API
public Set<String> consumeProperties(Context context)
@AutoValue @AutoValue
public abstract class Payment implements Parcelable { public abstract class Payment implements Parcelable {
public abstract String note(); public abstract String note();
} }
JavaPoet: github.com/square/javapoet
Truth: github.com/google/truth
compile-testing: github.com/google/compile-testing
auto/service: github.com/google/auto
1.2-SNAPSHOT?!?
1.2-SNAPSHOT?!?
Big
Bang
1.2-SNAPSHOT?!?
Big
Bang
Big
Bang
Big
Bang