Slide 1

Slide 1 text

AutoValue for Easier Life shaunkawano

Slide 2

Slide 2 text

AutoValue for Easier Life • Background of Ameba • AutoValue • Extra Android based talking

Slide 3

Slide 3 text

(One of the)
 Oldest App in CyberAgent, Inc. Own Abstraction, Unique Implementation New Team Members Inconsistency Codes Throughout the App Writing Tests, Removing Tests Unknown Specification

Slide 4

Slide 4 text

For Starting Out, We’d like to do 2 things. 2. Avoid Writing Boilerplate Codes 1. Remove Boilerplate Codes

Slide 5

Slide 5 text

AutoValue https://github.com/google/auto/tree/master/value

Slide 6

Slide 6 text

Article.class Amazingly Simple POJO

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

We want Article to be Value-Typed

Slide 10

Slide 10 text

We want Article to be Value-Typed (immutable, null-safe)

Slide 11

Slide 11 text

1. Finalize class and fields

Slide 12

Slide 12 text

1. Finalize class and fields 2. Add constructor

Slide 13

Slide 13 text

1. Finalize class and fields 2. Add constructor 3. Add getters

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Is only referential equality safe enough?

Slide 18

Slide 18 text

Override equals()

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Override hashCode() (if use Article as key in Set or Map(s))

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

toString() is nice for debugging!

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Parcelable?

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

Before-After

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

~100 Lines

Slide 30

Slide 30 text

Add New Field? Remove New Field? Inner Classes with Parcelable? Adding New Parcelable Tests? Removing Parcelable Tests?

Slide 31

Slide 31 text

AutoValue https://github.com/google/auto/tree/master/value

Slide 32

Slide 32 text

Usage // root dependencies { classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ … } … // app dependencies { provided 'com.google.auto.value:auto-value:1.3-rc2' }

Slide 33

Slide 33 text

AutoValue

Slide 34

Slide 34 text

AutoValue • Add @AutoValue to make objects value- typed using generated boilerplate codes

Slide 35

Slide 35 text

@AutoValue

Slide 36

Slide 36 text

@AutoValue

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

AutoValue • Add @AutoValue to make objects value- typed using generated boilerplate codes

Slide 39

Slide 39 text

AutoValue • Add @AutoValue to make objects value- typed using generated boilerplate codes • Add @AutoValue.Builder to create Builder class for your auto-value object

Slide 40

Slide 40 text

@AutoValue.Builder

Slide 41

Slide 41 text

@AutoValue.Builder

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

AutoValue • Add @AutoValue to make objects value- typed using generated boilerplate codes • Add @AutoValue.Builder to create Builder class for your auto-value object

Slide 44

Slide 44 text

AutoValue • Add @AutoValue to make objects value- typed using generated boilerplate codes • Add @AutoValue.Builder to create Builder class for your auto-value object • AutoValue Extension support for 
 Parcelable, Gson, Moshi, Cursor, and more..

Slide 45

Slide 45 text

Usage(auto-value-parcel) // root dependencies { classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ … } … // app dependencies { provided ‘com.google.auto.value:auto-value:1.3-rc2' // auto-value-parcel apt 'com.ryanharter.auto.value:auto-value-parcel:0.2.3-rc2' }

Slide 46

Slide 46 text

Usage(auto-value-parcel) // root dependencies { classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ … } … // app dependencies { provided ‘com.google.auto.value:auto-value:1.3-rc2' // auto-value-parcel apt 'com.ryanharter.auto.value:auto-value-parcel:0.2.3-rc2' }

Slide 47

Slide 47 text

AutoValue Extension: auto-value-parcel

Slide 48

Slide 48 text

AutoValue Extension: auto-value-parcel

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

// AutoValue provided 'com.google.auto.value:auto-value:1.3-rc2' apt 'com.ryanharter.auto.value:auto-value-parcel:0.2.3-rc2' apt 'com.ryanharter.auto.value:auto-value-gson:0.3.2-rc1' apt 'com.gabrielittner.auto.value:auto-value-with:1.0.0-rc1' AutoValue in Our App

Slide 51

Slide 51 text

Extra

Slide 52

Slide 52 text

Extra 1. AutoValue Cos 2. AutoValue Pros

Slide 53

Slide 53 text

AutoValue Cons ɾStrict Null Safety ɾCostly Field Update

Slide 54

Slide 54 text

Costly Field Update

Slide 55

Slide 55 text

Costly Field Update mSomeValue.value = “value”

Slide 56

Slide 56 text

Costly Field Update mSomeValue.value = “value” Not Accessible OF COURSE.

Slide 57

Slide 57 text

Costly Field Update mSomeValue = newValue

Slide 58

Slide 58 text

“With-er” auto-value-with public abstract SomeValue withNewId(String newId); @Override public final SomeValue withNewId(String newId) { return new AutoValue_SomeValue(newId); } Generated Code:

Slide 59

Slide 59 text

“With-er” auto-value-with public abstract SomeValue withNewId(String newId); @Override public final SomeValue withNewId(String newId) { return new AutoValue_SomeValue(newId); } Generated Code:

Slide 60

Slide 60 text

“With-er” auto-value-with mSomeValue = mSomeValue.witNewId(newId);

Slide 61

Slide 61 text

Strict Null Safety

Slide 62

Slide 62 text

Strict Null Safety Non-fatal Exception: java.lang.IllegalStateException: Missing required properties: someValue …

Slide 63

Slide 63 text

AutoValue Pros

Slide 64

Slide 64 text

AutoValue Pros ɾCommunication with Server Engineers ɾFaster JSON De/Serialization

Slide 65

Slide 65 text

Faster JSON De/Serialization

Slide 66

Slide 66 text

auto-value-gson // The public static method returning a TypeAdapter is what // tells auto-value-gson to create a TypeAdapter for Foo. public static TypeAdapter typeAdapter(Gson gson) { return new AutoValue_Foo.GsonTypeAdapter(gson); } } final Gson gson = new GsonBuilder() .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory()) .create(); https://github.com/rharter/auto-value-gson

Slide 67

Slide 67 text

http://dubedout.eu/2016/07/11/faster-json-deserialization-autovalue-extension/

Slide 68

Slide 68 text

http://dubedout.eu/2016/07/11/faster-json-deserialization-autovalue-extension/ “We gain from 200% to 400% speed.”

Slide 69

Slide 69 text

Communication with Server Engineers

Slide 70

Slide 70 text

Non-fatal Exception: java.lang.IllegalStateException: Missing required properties: someValue …

Slide 71

Slide 71 text

“Is this value @Nullable”?

Slide 72

Slide 72 text

“Is this value @Nullable”? “Is this document Updated?”

Slide 73

Slide 73 text

More Active Communication Between Native Engineers and Server-side Engineers!

Slide 74

Slide 74 text

Let’s use AutoValue for making our life easier!

Slide 75

Slide 75 text

AutoValue for Easier Life shaunkawano fin.