savedInstanceState) { Debug.startMethodTracing(); super.onCreate(savedInstanceState); /* doing the do */ Debug.stopMethodTracing(); } • Чтобы удалить или поменять нужно целых два телодвижения • А что если мы хотим применить ко всем Activity#onCreate? • А что если мы хотим добавить этот код ко всем функциям во всех классах com.sample.package начинающимся с set...?
сквозной код • Работает с .class-файлами • Из коробки генерирует список классов, которые были затронуты А что не так? • Удачи с тестированием • Jack&Jill
сквозной код • Работает с .class-файлами • Из коробки генерирует список классов, которые были затронуты А что не так? • Удачи с тестированием • Jack&Jill А кто использует? • https://github.com/JakeWharton/hugo
User create(long id, String name, String userPic) { return new AutoValue_User(id, name, userPic); } public abstract long id(); public abstract String name(); public abstract String userPic(); }
User create(long id, String name, String userPic) { return new AutoValue_User(id, name, userPic); } public abstract long id(); public abstract String name(); public abstract String userPic(); } final class AutoValue_User extends User { private final long id; private final String name; private final String userPic; AutoValue_User( long id, String name, String userPic) { this.id = id; if (name == null) { throw new NullPointerException("Null name"); } this.name = name; if (userPic == null) { throw new NullPointerException("Null userPic"); } this.userPic = userPic; } @Override public long id() { return id; } @Override public String name() { return name; } @Override public String userPic() { return userPic; } @Override public String toString() { return "Data{" + "id=" + id + ", " + "name=" + name + ", " + "userPic=" + userPic + "}"; } @Override public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof User) { Data that = (User) o; return (this.id == that.id()) && (this.name.equals(that.name())) && (this.userPic.equals(that.userPic())); } return false; } @Override public int hashCode() { int h = 1; h *= 1000003; h ^= (this.id >>> 32) ^ this.id; h *= 1000003; h ^= this.name.hashCode(); h *= 1000003; h ^= this.userPic.hashCode(); return h; } }
class $AutoValue_Data extends Data { /* sample autovalue implementation */ private final int describeContents; public int describeContents() { return describeContents; } } abstract class $AutoValue_Data extends Data { /* sample autovalue implementation */ public abstract int describeContents(); }
• Легко тестировать • Сгенерированный код можно безболезненно дебажить • Никаких ограничений на генерацию нового кода по аннотациям А кто использует? • Dagger 2 • Butterknife • IcePick • …
со всем, что не Java • Документация? • В любой момент может отвалиться • Jack&Jill • Переделываем AST как угодно без ограничений, без регистрации и смс
со всем, что не Java • Документация? • В любой момент может отвалиться • Jack&Jill А кто использует? • ¯\_(ツ)_/¯ • Переделываем AST как угодно без ограничений, без регистрации и смс