SlideShare a Scribd company logo
1 of 58
Download to read offline
読むと怖くないDagger2
kyobashi.dex #1
プロフィール
釘宮 愼之介 / @kgmyshin
Androidエンジニア
福岡県福岡市南区野多目出身
この資料の目的
Dagger2で生成されるソースを読んで、
動きを理解する
今回話さないこと
•DIとは
•Dagger2の使い所
•どういう構成にするか
•DaggerとDagger2の違い
今回話すこと
ひたすら生成されたソースを見て
裏でどういう動きをするのかを見る
Target Annotation
•Component
•Module
•Singleton
•Inject
•Scope
Target Annotation
•Component
•Module
•Singleton
•Inject
•Scope 時間的に無理でした
Case 1 Minimum
public interface Bread {

}
public class Chokokorone implements Bread {

}
@Component(modules = BreadModule.class)

interface BreadShop {

Bread bread();

}
@Module

public class BreadModule {

@Provides

Bread provideBread() {

return new Chokokorone();

}

}
BreadShop shop = DaggerBreadShop

.builder()

.breadModule(new BreadModule())

.build();
Bread bread = shop.bread();
BreadShop shop = DaggerBreadShop

.builder()

.breadModule(new BreadModule())

.build();
Bread bread = shop.bread(); // Chokokorone
Generated Codes
• DaggerBreadShop
• BreadModule_ProvideBreadFactory
@Generated("dagger.internal.codegen.ComponentProcessor")

public final class DaggerBreadShop implements BreadShop {

private Provider<Bread> provideBreadProvider;



private DaggerBreadShop(Builder builder) { 

assert builder != null;

initialize(builder);

}



public static Builder builder() { 

return new Builder();

}



public static BreadShop create() { 

return builder().build();

}



private void initialize(final Builder builder) { 

this.provideBreadProvider = BreadModule_ProvideBreadFactory.create(builder.breadModule);

}



@Override

public Bread bread() { 

return provideBreadProvider.get();

}



public static final class Builder {

private BreadModule breadModule;



private Builder() { 

}



public BreadShop build() { 

if (breadModule == null) {

this.breadModule = new BreadModule();

}

return new DaggerBreadShop(this);

}



public Builder breadModule(BreadModule breadModule) { 

if (breadModule == null) {

throw new NullPointerException("breadModule");

}

this.breadModule = breadModule;

return this;

}

}

}
}



public static final class Builder {

private BreadModule breadModule;



private Builder() { 

}



public BreadShop build() { 

if (breadModule == null) {

this.breadModule = new BreadModule();

}

return new DaggerBreadShop(this);

}



public Builder breadModule(BreadModule breadModule) { 

if (breadModule == null) {

throw new NullPointerException("breadModule");

}

this.breadModule = breadModule;

return this;

}

}

}



public static final class Builder {

private BreadModule breadModule;



private Builder() { 

}



public BreadShop build() { 

if (breadModule == null) {

this.breadModule = new BreadModule();

}

return new DaggerBreadShop(this);

}



public Builder breadModule(BreadModule breadModule) { 

if (breadModule == null) {

throw new NullPointerException("breadModule");

}

this.breadModule = breadModule;

return this;

}

}

@Generated("dagger.internal.codegen.ComponentProcessor")

public final class DaggerBreadShop implements BreadShop {

private Provider<Bread> provideBreadProvider;



private DaggerBreadShop(Builder builder) { 

assert builder != null;

initialize(builder);

}



private void initialize(final Builder builder) { 

this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);

}



@Override

public Bread bread() { 

return provideBreadProvider.get();

}



public static final class Builder {

private BreadModule breadModule;



private Builder() { 

@Generated("dagger.internal.codegen.ComponentProcessor")

public final class DaggerBreadShop implements BreadShop {

private Provider<Bread> provideBreadProvider;



private DaggerBreadShop(Builder builder) { 

assert builder != null;

initialize(builder);

}



private void initialize(final Builder builder) { 

this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);

}



@Override

public Bread bread() { 

return provideBreadProvider.get();

}



public static final class Builder {

private BreadModule breadModule;



private Builder() { 

@Generated("dagger.internal.codegen.ComponentProcessor")

public final class BreadModule_ProvideBreadFactory implements Factory<Bread> {

private final BreadModule module;



public BreadModule_ProvideBreadFactory(BreadModule module) { 

assert module != null;

this.module = module;

}



@Override

public Bread get() { 

Bread provided = module.provideBread();

if (provided == null) {

throw new NullPointerException("Cannot return null from a non-@Nullable @Provides m
}

return provided;

}



public static Factory<Bread> create(BreadModule module) { 

return new BreadModule_ProvideBreadFactory(module);

}

}
@Generated("dagger.internal.codegen.ComponentProcessor")

public final class BreadModule_ProvideBreadFactory implements Factory<Bread> {

private final BreadModule module;



public BreadModule_ProvideBreadFactory(BreadModule module) { 

assert module != null;

this.module = module;

}



@Override

public Bread get() { 

Bread provided = module.provideBread();

if (provided == null) {

throw new NullPointerException("Cannot return null from a non-@Nullable @Provides m
}

return provided;

}



public static Factory<Bread> create(BreadModule module) { 

return new BreadModule_ProvideBreadFactory(module);

}

}
DaggerBreadShop::bread()
DaggerBreadShop::bread()
BreadModule_ProvideBreadFactory::get()
DaggerBreadShop::bread()
BreadModule_ProvideBreadFactory::get()
BreadModule::provideBread()
DaggerBreadShop::bread()
BreadModule_ProvideBreadFactory::get()
BreadModule::provideBread()
new Chokokorone()!!
Case 2 Singleton
@Component(modules = BreadModule.class)

interface BreadShop {

Bread bread();

}
@Module

public class BreadModule {

@Provides

Bread provideBread() {

return new Chokokorone();

}

}
Before
@Singleton
@Component(modules = BreadModule.class)

interface BreadShop {

Bread bread();

}
@Module

public class BreadModule {
@Singleton

@Provides

Bread provideBread() {

return new Chokokorone();

}

}
After
@Singleton
@Component(modules = BreadModule.class)

interface BreadShop {

Bread bread();

}
@Module

public class BreadModule {
@Singleton

@Provides

Bread provideBread() {

return new Chokokorone();

}

}
After
Generated Codes
• DaggerBreadShop
• BreadModule_ProvideBreadFactory
Generated Codes
• DaggerBreadShop
• BreadModule_ProvideBreadFactory
private void initialize(final Builder builder) { 

this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);

}
Before
private void initialize(final Builder builder) { 

this.provideBreadProvider = 

ScopedProvider.create(

BreadModule_ProvideBreadFactory.create(builder.breadModule)

);

}
After
private void initialize(final Builder builder) { 

this.provideBreadProvider = 

ScopedProvider.create(

BreadModule_ProvideBreadFactory.create(builder.breadModule)

);

}
After
public final class ScopedProvider<T> implements Provider<T> {


:


@Override

public T get() {

// double-check idiom from EJ2: Item 71

Object result = instance;

if (result == UNINITIALIZED) {

synchronized (this) {

result = instance;

if (result == UNINITIALIZED) {

instance = result = factory.get();

}

}

}

return (T) result;

}


:


}
DaggerBreadShop::bread()
DaggerBreadShop::bread()
ScopedProvider::get()
DaggerBreadShop::bread()
ScopedProvider::get()
BreadModule::provideBread()
DaggerBreadShop::bread()
ScopedProvider::get()
BreadModule::provideBread()
new Chokokorone()!! (1度取得したら使い回す)
Case 3 Inject
@Component(modules = BreadModule.class)

interface BreadShop {

Bread bread();

}
Before
BreadShop shop = DaggerBreadShop

.builder()

.breadModule(new BreadModule())

.build();
Bread bread = shop.bread();
Before
@Component(modules = BreadModule.class)

interface BreadShop {

void bread(Lunch lunch);

}
After
public class Lunch {

@Inject

Bread bread;

}
@Component(modules = BreadModule.class)

interface BreadShop {

void bread(Lunch lunch);

}
After
public class Lunch {

@Inject

Bread bread;

}
BreadShop shop = DaggerBreadShop

.builder()

.breadModule(new BreadModule())

.build();

Lunch lunch = new Lunch();

shop.bread(lunch); // lunch.bread is Chokokorone
After
BreadShop shop = DaggerBreadShop

.builder()

.breadModule(new BreadModule())

.build();

Lunch lunch = new Lunch();

shop.bread(lunch); // lunch.bread is Chokokorone
After
Generated Codes
• DaggerBreadShop
• BreadModule_ProvideBreadFactory
• Lunch_MembersInjector
Generated Codes
• DaggerBreadShop
• BreadModule_ProvideBreadFactory
• Lunch_MembersInjector
private void initialize(final Builder builder) { 

this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);

}



@Override

public Bread bread() { 

return provideBreadProvider.get();

}
Before
private void initialize(final Builder builder) { 

this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);

this.lunchMembersInjector =
Lunch_MembersInjector.create(provideBreadProvider);

}



@Override

public void bread(Lunch lunch) { 

lunchMembersInjector.injectMembers(lunch);

}
After
private void initialize(final Builder builder) { 

this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);

this.lunchMembersInjector =
Lunch_MembersInjector.create(provideBreadProvider);

}



@Override

public void bread(Lunch lunch) { 

lunchMembersInjector.injectMembers(lunch);

}
After
@Generated("dagger.internal.codegen.ComponentProcessor")

public final class Lunch_MembersInjector implements MembersInjector<Lunch> {

private final Provider<Bread> breadProvider;



public Lunch_MembersInjector(Provider<Bread> breadProvider) { 

assert breadProvider != null;

this.breadProvider = breadProvider;

}



@Override

public void injectMembers(Lunch instance) { 

if (instance == null) {

throw new NullPointerException("Cannot inject members into a null reference
}

instance.bread = breadProvider.get();

}



public static MembersInjector<Lunch> create(Provider<Bread> breadProvider) { 

return new Lunch_MembersInjector(breadProvider);

}

}
@Generated("dagger.internal.codegen.ComponentProcessor")

public final class Lunch_MembersInjector implements MembersInjector<Lunch> {

private final Provider<Bread> breadProvider;



public Lunch_MembersInjector(Provider<Bread> breadProvider) { 

assert breadProvider != null;

this.breadProvider = breadProvider;

}



@Override

public void injectMembers(Lunch instance) { 

if (instance == null) {

throw new NullPointerException("Cannot inject members into a null reference
}

instance.bread = breadProvider.get();

}



public static MembersInjector<Lunch> create(Provider<Bread> breadProvider) { 

return new Lunch_MembersInjector(breadProvider);

}

}
DaggerBreadShop::bread(Lunch launch)
DaggerBreadShop::bread(Lunch launch)
Lunch_MembersInjector::injectMembers(Lunch launch)
DaggerBreadShop::bread(Lunch launch)
Lunch_MembersInjector::injectMembers(Lunch launch)
lunch = BreadModule_ProvideBreadFactory::get()
DaggerBreadShop::bread(Lunch launch)
Lunch_MembersInjector::injectMembers(Lunch launch)
lunch = BreadModule_ProvideBreadFactory::get()
lunch = BreadModule::provideBread()
DaggerBreadShop::bread(Lunch launch)
Lunch_MembersInjector::injectMembers(Lunch launch)
lunch = BreadModule_ProvideBreadFactory::get()
lunch = BreadModule::provideBread()
lunch = new Chokokorone()!!
まとめ
Dagger2は怖くない

More Related Content

What's hot

The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181Mahmoud Samir Fayed
 
Code to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern ApplicationsCode to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern ApplicationsCaleb Jenkins
 
Reactive Type-safe WebComponents
Reactive Type-safe WebComponentsReactive Type-safe WebComponents
Reactive Type-safe WebComponentsMartin Hochel
 

What's hot (7)

The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181
 
Speed up your GWT coding with gQuery
Speed up your GWT coding with gQuerySpeed up your GWT coding with gQuery
Speed up your GWT coding with gQuery
 
Clean Javascript
Clean JavascriptClean Javascript
Clean Javascript
 
Code to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern ApplicationsCode to DI For - Dependency Injection for Modern Applications
Code to DI For - Dependency Injection for Modern Applications
 
Reactive Type-safe WebComponents
Reactive Type-safe WebComponentsReactive Type-safe WebComponents
Reactive Type-safe WebComponents
 
Introducing GWT Polymer (vaadin)
Introducing GWT Polymer (vaadin)Introducing GWT Polymer (vaadin)
Introducing GWT Polymer (vaadin)
 
Rock GWT UI's with Polymer Elements
Rock GWT UI's with Polymer ElementsRock GWT UI's with Polymer Elements
Rock GWT UI's with Polymer Elements
 

Viewers also liked

Run somke test on AWS DeviceFarm
Run somke test on AWS DeviceFarmRun somke test on AWS DeviceFarm
Run somke test on AWS DeviceFarmNaoki AINOYA
 
パスの日記
パスの日記パスの日記
パスの日記Mima Yuki
 
Multiple apk for Density
Multiple apk for DensityMultiple apk for Density
Multiple apk for DensityTazake
 
Androidで部 第7回 APTすごい
Androidで部 第7回 APTすごいAndroidで部 第7回 APTすごい
Androidで部 第7回 APTすごいMasahiro Wakame
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法cch-robo
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことTitanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことRyutaro Miyashita
 
ZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるcch-robo
 
Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。cch-robo
 
Architecture driven development のすすめ
Architecture driven development のすすめArchitecture driven development のすすめ
Architecture driven development のすすめAtsushi Fukui
 
Android で Realm を使ってみよう
Android で Realm を使ってみようAndroid で Realm を使ってみよう
Android で Realm を使ってみようRyutaro Miyashita
 
Whats's new in Android Studio at Google I/O extended in Fukuoka
Whats's new in Android Studio at Google I/O extended in FukuokaWhats's new in Android Studio at Google I/O extended in Fukuoka
Whats's new in Android Studio at Google I/O extended in FukuokaYuki Anzai
 
Androidオールスターズ2016 yanzm
Androidオールスターズ2016 yanzmAndroidオールスターズ2016 yanzm
Androidオールスターズ2016 yanzmYuki Anzai
 
droidgirls Recyclerview
droidgirls Recyclerviewdroidgirls Recyclerview
droidgirls RecyclerviewYuki Anzai
 
Master of RecyclerView
Master of RecyclerViewMaster of RecyclerView
Master of RecyclerViewYuki Anzai
 
これからの設計の話をしよう
これからの設計の話をしようこれからの設計の話をしよう
これからの設計の話をしようshinnosuke kugimiya
 

Viewers also liked (20)

Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Run somke test on AWS DeviceFarm
Run somke test on AWS DeviceFarmRun somke test on AWS DeviceFarm
Run somke test on AWS DeviceFarm
 
パスの日記
パスの日記パスの日記
パスの日記
 
Multiple apk for Density
Multiple apk for DensityMultiple apk for Density
Multiple apk for Density
 
20150907 kyobashidex
20150907 kyobashidex20150907 kyobashidex
20150907 kyobashidex
 
Timber
TimberTimber
Timber
 
Androidで部 第7回 APTすごい
Androidで部 第7回 APTすごいAndroidで部 第7回 APTすごい
Androidで部 第7回 APTすごい
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことTitanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
 
ZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみる
 
Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。
 
Wearable realm
Wearable realmWearable realm
Wearable realm
 
Architecture driven development のすすめ
Architecture driven development のすすめArchitecture driven development のすすめ
Architecture driven development のすすめ
 
Android で Realm を使ってみよう
Android で Realm を使ってみようAndroid で Realm を使ってみよう
Android で Realm を使ってみよう
 
Coordinator Layout Behavior
Coordinator Layout BehaviorCoordinator Layout Behavior
Coordinator Layout Behavior
 
Whats's new in Android Studio at Google I/O extended in Fukuoka
Whats's new in Android Studio at Google I/O extended in FukuokaWhats's new in Android Studio at Google I/O extended in Fukuoka
Whats's new in Android Studio at Google I/O extended in Fukuoka
 
Androidオールスターズ2016 yanzm
Androidオールスターズ2016 yanzmAndroidオールスターズ2016 yanzm
Androidオールスターズ2016 yanzm
 
droidgirls Recyclerview
droidgirls Recyclerviewdroidgirls Recyclerview
droidgirls Recyclerview
 
Master of RecyclerView
Master of RecyclerViewMaster of RecyclerView
Master of RecyclerView
 
これからの設計の話をしよう
これからの設計の話をしようこれからの設計の話をしよう
これからの設計の話をしよう
 

Similar to Dagger2で生成されるソースを読むと怖くない

Dependency Injection on Android
Dependency Injection on AndroidDependency Injection on Android
Dependency Injection on AndroidJoan Puig Sanz
 
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...DicodingEvent
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02rhemsolutions
 
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014First Tuesday Bergen
 
Under the Hood: Using Spring in Grails
Under the Hood: Using Spring in GrailsUnder the Hood: Using Spring in Grails
Under the Hood: Using Spring in GrailsGR8Conf
 
Hacking the Codename One Source Code - Part IV.pdf
Hacking the Codename One Source Code - Part IV.pdfHacking the Codename One Source Code - Part IV.pdf
Hacking the Codename One Source Code - Part IV.pdfShaiAlmog1
 
Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFPierre-Yves Ricau
 
Sword fighting with Dagger GDG-NYC Jan 2016
 Sword fighting with Dagger GDG-NYC Jan 2016 Sword fighting with Dagger GDG-NYC Jan 2016
Sword fighting with Dagger GDG-NYC Jan 2016Mike Nakhimovich
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andevMike Nakhimovich
 
Android Loaders : Reloaded
Android Loaders : ReloadedAndroid Loaders : Reloaded
Android Loaders : Reloadedcbeyls
 
MCE^3 - Gregory Kick - Dagger 2
MCE^3 - Gregory Kick - Dagger 2 MCE^3 - Gregory Kick - Dagger 2
MCE^3 - Gregory Kick - Dagger 2 PROIDEA
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Padroes Projeto
Padroes ProjetoPadroes Projeto
Padroes Projetolcbj
 
Dependency Injections in Kotlin
Dependency Injections in KotlinDependency Injections in Kotlin
Dependency Injections in KotlinEatDog
 

Similar to Dagger2で生成されるソースを読むと怖くない (20)

Dependency Injection on Android
Dependency Injection on AndroidDependency Injection on Android
Dependency Injection on Android
 
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Annotation processing tool
Annotation processing toolAnnotation processing tool
Annotation processing tool
 
Popup view on Mortar
Popup view on MortarPopup view on Mortar
Popup view on Mortar
 
Dependency Injection for Android
Dependency Injection for AndroidDependency Injection for Android
Dependency Injection for Android
 
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
 
Under the Hood: Using Spring in Grails
Under the Hood: Using Spring in GrailsUnder the Hood: Using Spring in Grails
Under the Hood: Using Spring in Grails
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Hacking the Codename One Source Code - Part IV.pdf
Hacking the Codename One Source Code - Part IV.pdfHacking the Codename One Source Code - Part IV.pdf
Hacking the Codename One Source Code - Part IV.pdf
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
 
Sword fighting with Dagger GDG-NYC Jan 2016
 Sword fighting with Dagger GDG-NYC Jan 2016 Sword fighting with Dagger GDG-NYC Jan 2016
Sword fighting with Dagger GDG-NYC Jan 2016
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Android Loaders : Reloaded
Android Loaders : ReloadedAndroid Loaders : Reloaded
Android Loaders : Reloaded
 
MCE^3 - Gregory Kick - Dagger 2
MCE^3 - Gregory Kick - Dagger 2 MCE^3 - Gregory Kick - Dagger 2
MCE^3 - Gregory Kick - Dagger 2
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Padroes Projeto
Padroes ProjetoPadroes Projeto
Padroes Projeto
 
Dependency Injections in Kotlin
Dependency Injections in KotlinDependency Injections in Kotlin
Dependency Injections in Kotlin
 

More from shinnosuke kugimiya

このあと滅茶苦茶LGTMした
このあと滅茶苦茶LGTMしたこのあと滅茶苦茶LGTMした
このあと滅茶苦茶LGTMしたshinnosuke kugimiya
 
例の縛るやつ(Data binding)
例の縛るやつ(Data binding)例の縛るやつ(Data binding)
例の縛るやつ(Data binding)shinnosuke kugimiya
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話shinnosuke kugimiya
 
Model View Presenter for Android
Model View Presenter for AndroidModel View Presenter for Android
Model View Presenter for Androidshinnosuke kugimiya
 
あの日見たMVCを僕たちはまだ知らない for RoR
あの日見たMVCを僕たちはまだ知らない for RoRあの日見たMVCを僕たちはまだ知らない for RoR
あの日見たMVCを僕たちはまだ知らない for RoRshinnosuke kugimiya
 
開発効率アンチパターン
開発効率アンチパターン開発効率アンチパターン
開発効率アンチパターンshinnosuke kugimiya
 

More from shinnosuke kugimiya (10)

Framework code reading
Framework code readingFramework code reading
Framework code reading
 
このあと滅茶苦茶LGTMした
このあと滅茶苦茶LGTMしたこのあと滅茶苦茶LGTMした
このあと滅茶苦茶LGTMした
 
just one line
just one linejust one line
just one line
 
例の縛るやつ(Data binding)
例の縛るやつ(Data binding)例の縛るやつ(Data binding)
例の縛るやつ(Data binding)
 
Android Architecture
Android ArchitectureAndroid Architecture
Android Architecture
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話
 
Model View Presenter for Android
Model View Presenter for AndroidModel View Presenter for Android
Model View Presenter for Android
 
あの日見たMVCを僕たちはまだ知らない for RoR
あの日見たMVCを僕たちはまだ知らない for RoRあの日見たMVCを僕たちはまだ知らない for RoR
あの日見たMVCを僕たちはまだ知らない for RoR
 
開発効率アンチパターン
開発効率アンチパターン開発効率アンチパターン
開発効率アンチパターン
 
Reactive android
Reactive androidReactive android
Reactive android
 

Recently uploaded

Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 

Recently uploaded (20)

Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 

Dagger2で生成されるソースを読むと怖くない