SlideShare a Scribd company logo
I come with knifes
A story of Daggers and Toothpicks…
Droidcon Krakow 2016
Danny Preussler
@PreusslerBerlin
@PreusslerBerlin
Once upon a time
@PreusslerBerlin
A single activity
@PreusslerBerlin
public class LonelyActivity extends Activity {
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
}
}
@PreusslerBerlin
needs to
@PreusslerBerlin
needs to support
@PreusslerBerlin
needs to support
Tracking
@PreusslerBerlin
The journey to testability starts
@PreusslerBerlin
Starring
@PreusslerBerlin
Tracker as component
public interface Tracker {
void trackStarted();
}
@PreusslerBerlin
GoogleAnalyticsTracker as Tracker
public class GoogleAnalyticsTracker
implements Tracker {
@Override
public void trackStarted() {
}
}
@PreusslerBerlin
Prolog
The Untestable
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
Not testable!
@PreusslerBerlin
A voice out of the dark:
Inversion of Control!
@PreusslerBerlin
A voice out of the dark:
Inversion of Control!
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
@PreusslerBerlin
Act I
The Factory
@PreusslerBerlin
public class Dependencies {
static Dependencies instance = new Dependencies();
public static Dependencies getInstance() {
return instance;
}
public Tracker getTracker() {
return new GoogleAnalyticsTracker();
}
…
@PreusslerBerlin
public class Dependencies {
static Dependencies instance = new Dependencies();
public static Dependencies getInstance() {
return instance;
}
public Tracker getTracker() {
return new GoogleAnalyticsTracker();
}
…
@PreusslerBerlin
public class Dependencies {
static Dependencies instance = new Dependencies();
public static Dependencies getInstance() {
return instance;
}
public Tracker getTracker() {
return new GoogleAnalyticsTracker();
}
…
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().getTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().getTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
@Mock Tracker tracker;
@Before
public void setup() {
…
Dependencies.instance = mock(Dependencies.class);
when(Dependencies.instance.getTracker())
.thenReturn(tracker);
}
@Test
public void should_track() {
new SimpleActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
@Mock Tracker tracker;
@Before
public void setup() {
…
Dependencies.instance = mock(Dependencies.class);
when(Dependencies.instance.getTracker())
.thenReturn(tracker);
}
@Test
public void should_track() {
new SimpleActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
@Mock Tracker tracker;
@Before
public void setup() {
…
Dependencies.instance = mock(Dependencies.class);
when(Dependencies.instance.getTracker())
.thenReturn(tracker);
}
@Test
public void should_track() {
new SimpleActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
+/- Somehow testable
- Not very dynamic
- Lots of code
@PreusslerBerlin
Act II
The Map
@PreusslerBerlin
public class Dependencies {
static Map<Class, Class> modules = new HashMap<>();
static {
modules.put(
Tracker.class,
new GoogleAnalyticsTracker());
}
public static <T> T get(Class<T> clzz) {
return (T) modules.get(clzz);
}
}
@PreusslerBerlin
public class Dependencies {
static Map<Class, Class> modules = new HashMap<>();
static {
modules.put(
Tracker.class,
new GoogleAnalyticsTracker());
}
public static <T> T get(Class<T> clzz) {
return (T) modules.get(clzz);
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
+ Testable
+ Dynamic
- Instances created at startup
@PreusslerBerlin
Act III
Reflection(s)
@PreusslerBerlin
public class Dependencies {
private final static Map<Class, Class> modules
= new HashMap<>();
static {
modules.put(
Tracker.class,
GoogleAnalyticsTracker.class);
}
static <T> T get(Class<T> clzz) {
…
@PreusslerBerlin
public class GoogleAnalyticsTracker implements Tracker {
GoogleAnalyticsTracker(Activity activity) {
...}
GoogleAnalyticsTracker(Application application) {
...}
GoogleAnalyticsTracker(Context context) {
...}
...
@PreusslerBerlin
public class GoogleAnalyticsTracker implements Tracker {
GoogleAnalyticsTracker(Activity activity) {
...}
GoogleAnalyticsTracker(Application application) {
...}
@Inject
GoogleAnalyticsTracker(Context context) {
...}
...
@PreusslerBerlin
package javax.inject;
@Target({ METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
public @interface Inject {}
@PreusslerBerlin
public class Dependencies {
private final static Map<Class, Class> modules
= new HashMap<>();
static {
modules.put(
Tracker.class,
GoogleAnalyticsTracker.class);
}
static <T> T get(Class<T> clzz) {
…
@PreusslerBerlin
static <T> T get(Class<T> clzz) {
…
Constructor<?>[] constructors =
clzz.getDeclaredConstructors();
for(Constructor ctr: constructors) {
@PreusslerBerlin
static <T> T get(Class<T> clzz) {
…
Constructor<?>[] constructors =
clzz.getDeclaredConstructors();
for(Constructor ctr: constructors) {
@PreusslerBerlin
...
if(ctr.getDeclaredAnnotation(Inject.class)
!= null) {
Class[] types = ctr.getParameterTypes();
Object[] params =
new Object[types.length];
for (int i=1; i< params.length; i++) {
params[i] = get(types[i]);
}
@PreusslerBerlin
if(ctr.getDeclaredAnnotation(Inject.class)
!= null) {
Class[] types = ctr.getParameterTypes();
Object[] params =
new Object[types.length];
for (int i=1; i< params.length; i++) {
params[i] = get(types[i]);
}
@PreusslerBerlin
if(ctr.getDeclaredAnnotation(Inject.class)
!= null) {
Class[] types = ctr.getParameterTypes();
Object[] params =
new Object[types.length];
for (int i=1; i< params.length; i++) {
params[i] = get(types[i]);
}
@PreusslerBerlin
...
try {
return (T) ctr.newInstance(params);
} catch (Exception e) {
...
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
+ Testable
+ Dynamic
+ Flexible
@PreusslerBerlin
Can we improve that?
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
Dependencies.inject(this);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
OMG,
We just built
@PreusslerBerlin
OMG,
We just built
Guice!
@PreusslerBerlin
OMG,
We just built
RoboGuice!
@PreusslerBerlin
OMG,
We just built
RoboGuice!
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
Dependencies.inject(this);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
- Reflection is slow
@PreusslerBerlin
"Avoid dependency injection frameworks”
- Google
developer.android.com/training/articles/memory.html#DependencyInjection
till early 2016
@PreusslerBerlin
Act IV
Compiler Magic
@PreusslerBerlin
Annotation processing
&
Code generation
@PreusslerBerlin
Here comes
Dagger as Hero
@PreusslerBerlin
The end!?
@PreusslerBerlin
In its first screen appearance:
Toothpick
as unknown stranger
@PreusslerBerlin
“YOUR boilerplate sucks”
@PreusslerBerlin
“YOU don’t even know
how to unit test!”
@PreusslerBerlin
Fight!
@PreusslerBerlin
The module
@PreusslerBerlin
@Module
static class BaseModule {
...
BaseModule(Application application) {
...
}
@Provides
public Tracker provideTracker() {
return new GoogleAnalyticsTracker();
}
}
@PreusslerBerlin
class BaseModule extends Module {
public BaseModule(Application application) {
bind(Tracker.class)
.to(GoogleAnalyticsTracker.class);
...
@PreusslerBerlin
The component
@PreusslerBerlin
@Component(modules = {BaseModule.class})
interface AppComponent {
void inject(LonelyActivity activity);
}
@PreusslerBerlin
“WHAT component???”
@PreusslerBerlin
Setup
Dagger 0 : 1 Toothpick
@PreusslerBerlin
Usage
@PreusslerBerlin
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
DaggerDependencies_AppComponent
.builder()
.baseModule(
new BaseModule(this))
.build()
@PreusslerBerlin
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
getApplication().getComponent().inject(this);
tracker.trackStarted();
}
}
@PreusslerBerlin
Scope scope =
openScope("APPLICATION")
scope.installModules(
new BaseModule(application));
@PreusslerBerlin
import static Toothpick.openScope;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
openScope("APPLICATION").inject(this);
tracker.trackStarted();
}
}
@PreusslerBerlin
Usage
Dagger 1 : 2 Toothpick
@PreusslerBerlin
Testing
@PreusslerBerlin
Testing
@PreusslerBerlin
@Mock Tracker tracker;
class TestModule extends Dependencies.BaseModule {
TestModule() {
super(mock(Application.class));
}
@Provides
public Tracker provideTracker() {
return tracker;
}
}
}
@PreusslerBerlin
@Mock Tracker tracker;
class TestModule extends Dependencies.BaseModule {
TestModule() {
super(mock(Application.class));
}
@Provides
public Tracker provideTracker() {
return tracker;
}
}
}
@PreusslerBerlin
@Test
public void should_track() {
Application.set(
DaggerDependencies_AppComponent
.builder().baseModule(
new TestModule()).build());
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
...
}
@PreusslerBerlin
@Test
public void should_track() {
Application.set(
DaggerDependencies_AppComponent
.builder().baseModule(
new TestModule()).build());
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
...
}
@PreusslerBerlin
@Mock Tracker tracker;
@Rule
public ToothPickRule toothPickRule =
new ToothPickRule(this, "APPLICATION_SCOPE");
@Test
public void should_track() {
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
@Mock Tracker tracker;
@Rule
public ToothPickRule toothPickRule =
new ToothPickRule(this, "APPLICATION_SCOPE");
@Test
public void should_track() {
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
Testing
Dagger 1 : 3 Toothpick
@PreusslerBerlin
Scopes
@PreusslerBerlin
@Singleton
@PreusslerBerlin
@Scope
@Retention(RUNTIME)
public @interface ActivityScope {}
@ActivityScope
@Subcomponent(modules = {ScopeModule.class})
interface ScopeComponent {
void inject(ScopeActivity activity);
}
@PreusslerBerlin
@Module
static class ScopeModule {
private Activity activity;
public ScopeModule(Activity activity) {
this.activity = activity;
}
@Provides @ActivityScope
public Activity provideActivity() {
return activity;
}
}
@PreusslerBerlin
@Component(modules = {BaseModule.class})
interface AppComponent {
void inject(LonelyActivity activity);
ScopeComponent plus(ScopeModule module);
}
@PreusslerBerlin
“That’s Annotation Porn!”
@PreusslerBerlin
public class ScopeActivity extends Activity {
…
private ScopeComponent scope;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
scope = createScope(this);
scope.inject(this);
…
}
// call from fragments...
public ScopeComponent getScope() {
return scope;
}
}
@PreusslerBerlin
public class ScopeActivity extends Activity {
…
private ScopeComponent scope;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
scope = createScope(this);
scope.inject(this);
…
}
// call from fragments...
public ScopeComponent getScope() {
return scope;
}
}
@PreusslerBerlin
“Stop this madness!”
@PreusslerBerlin
class ScopeModule extends Module {
public ScopeModule(Activity activity) {
bind(Activity.class).toInstance(activity);
}
@PreusslerBerlin
Scope scope =
openScopes(”APPLICATION_SCOPE”,
activity.getClass().getName());
scope.installModules(
new ScopeModule(activity));
@PreusslerBerlin
Scope scope =
openScopes(”APPLICATION_SCOPE”,
activity.getClass().getName());
scope.installModules(
new ScopeModule(activity));
@PreusslerBerlin
closeScope(
activity.getClass().getName());
@PreusslerBerlin
Scopes
Dagger 1 : 4 Toothpick
@PreusslerBerlin
Performance
1000 injections
• Dagger 1: 33 ms
• Dagger 2: 31 ms
• Toothpick: 35 ms
6400 injections
• Dagger 1: 45 ms
• Dagger 2: 42 ms
• Toothpick: 66 ms
@PreusslerBerlin
Performance
Dagger 2 : 4 Toothpick
@PreusslerBerlin
And there is more:
SmoothieModule
@PreusslerBerlin
Ease of
use
Speed
Roboguice
Dagger
Toothpick
@PreusslerBerlin
Dagger:
+ compile safe
+ feature rich
+ performant
@PreusslerBerlin
Dagger:
-heavy weight
- top down
- annotation porn
- hard on unit tests
@PreusslerBerlin
Toothpick:
+ light weight
+ bottom up
+ less boilerplate
+ testing focus
@PreusslerBerlin
Toothpick:
-not idiot proof
- performance
@PreusslerBerlin
Choose the
right tool
for your
problem!
ABetterToolbyTheMarmot,CCby2.0,flickr.com/photos/themarmot/6283203163
@PreusslerBerlin
github.com/
dpreussler/
understand_dependencies
@PreusslerBerlin
TP written by
Stephane Nicolas
Daniel Molinero Reguera
Presented by
Danny Preussler
Special thanks to
Florina Muntenescu

More Related Content

What's hot

DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicGraham Dumpleton
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
Danny Preussler
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To Test
Howard Lewis Ship
 
Introduzione al TDD
Introduzione al TDDIntroduzione al TDD
Introduzione al TDD
Andrea Francia
 
Spock
SpockSpock
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
Andres Almiray
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicox
David Rodenas
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS Programmers
David Rodenas
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Anton Arhipov
 
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloadingJEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
Anton Arhipov
 
GMock framework
GMock frameworkGMock framework
GMock framework
corehard_by
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test framework
Abner Chih Yi Huang
 
Unit/Integration Testing using Spock
Unit/Integration Testing using SpockUnit/Integration Testing using Spock
Unit/Integration Testing using Spock
Anuj Aneja
 
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
Thierry Wasylczenko
 
Smarter Testing With Spock
Smarter Testing With SpockSmarter Testing With Spock
Smarter Testing With Spock
IT Weekend
 
Smarter Testing with Spock
Smarter Testing with SpockSmarter Testing with Spock
Smarter Testing with SpockDmitry Voloshko
 
Spock: Test Well and Prosper
Spock: Test Well and ProsperSpock: Test Well and Prosper
Spock: Test Well and Prosper
Ken Kousen
 
groovy & grails - lecture 7
groovy & grails - lecture 7groovy & grails - lecture 7
groovy & grails - lecture 7
Alexandre Masselot
 
JS and patterns
JS and patternsJS and patterns
JS and patterns
David Rodenas
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for Programmers
David Rodenas
 

What's hot (20)

DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New Relic
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To Test
 
Introduzione al TDD
Introduzione al TDDIntroduzione al TDD
Introduzione al TDD
 
Spock
SpockSpock
Spock
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicox
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS Programmers
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011
 
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloadingJEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
 
GMock framework
GMock frameworkGMock framework
GMock framework
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test framework
 
Unit/Integration Testing using Spock
Unit/Integration Testing using SpockUnit/Integration Testing using Spock
Unit/Integration Testing using Spock
 
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
 
Smarter Testing With Spock
Smarter Testing With SpockSmarter Testing With Spock
Smarter Testing With Spock
 
Smarter Testing with Spock
Smarter Testing with SpockSmarter Testing with Spock
Smarter Testing with Spock
 
Spock: Test Well and Prosper
Spock: Test Well and ProsperSpock: Test Well and Prosper
Spock: Test Well and Prosper
 
groovy & grails - lecture 7
groovy & grails - lecture 7groovy & grails - lecture 7
groovy & grails - lecture 7
 
JS and patterns
JS and patternsJS and patterns
JS and patterns
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for Programmers
 

Viewers also liked

Toothpick & Dependency Injection
Toothpick & Dependency InjectionToothpick & Dependency Injection
Toothpick & Dependency Injection
Daniel Molinero Reguera
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Danny Preussler
 
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Danny Preussler
 
Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS
oGuild .
 
3.7 heap sort
3.7 heap sort3.7 heap sort
3.7 heap sort
Krish_ver2
 
Interfaces to ubiquitous computing
Interfaces to ubiquitous computingInterfaces to ubiquitous computing
Interfaces to ubiquitous computingswati sonawane
 
iBeacons: Security and Privacy?
iBeacons: Security and Privacy?iBeacons: Security and Privacy?
iBeacons: Security and Privacy?
Jim Fenton
 
Dependency Injection with Apex
Dependency Injection with ApexDependency Injection with Apex
Dependency Injection with Apex
Salesforce Developers
 
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Paolo Sammicheli
 
HUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory DatabasesHUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory Databases
John Mulhall
 
Agile Methodology PPT
Agile Methodology PPTAgile Methodology PPT
Agile Methodology PPT
Mohit Kumar
 
Skiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queuesSkiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queueszukun
 
Privacy Concerns and Social Robots
Privacy Concerns and Social Robots Privacy Concerns and Social Robots
Privacy Concerns and Social Robots
Christoph Lutz
 
ScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With ScrumScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With Scrum
Alexey Krivitsky
 
Design & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture NotesDesign & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture Notes
FellowBuddy.com
 
Final Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image ProcessingFinal Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image ProcessingSabnam Pandey, MBA
 
09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines
Andres Mendez-Vazquez
 
Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++
Daniele Pallastrelli
 
In-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 InstancesIn-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 Instances
SingleStore
 
Machine learning support vector machines
Machine learning   support vector machinesMachine learning   support vector machines
Machine learning support vector machines
Sjoerd Maessen
 

Viewers also liked (20)

Toothpick & Dependency Injection
Toothpick & Dependency InjectionToothpick & Dependency Injection
Toothpick & Dependency Injection
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
 
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
 
Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS
 
3.7 heap sort
3.7 heap sort3.7 heap sort
3.7 heap sort
 
Interfaces to ubiquitous computing
Interfaces to ubiquitous computingInterfaces to ubiquitous computing
Interfaces to ubiquitous computing
 
iBeacons: Security and Privacy?
iBeacons: Security and Privacy?iBeacons: Security and Privacy?
iBeacons: Security and Privacy?
 
Dependency Injection with Apex
Dependency Injection with ApexDependency Injection with Apex
Dependency Injection with Apex
 
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
 
HUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory DatabasesHUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory Databases
 
Agile Methodology PPT
Agile Methodology PPTAgile Methodology PPT
Agile Methodology PPT
 
Skiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queuesSkiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queues
 
Privacy Concerns and Social Robots
Privacy Concerns and Social Robots Privacy Concerns and Social Robots
Privacy Concerns and Social Robots
 
ScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With ScrumScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With Scrum
 
Design & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture NotesDesign & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture Notes
 
Final Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image ProcessingFinal Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image Processing
 
09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines
 
Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++
 
In-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 InstancesIn-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 Instances
 
Machine learning support vector machines
Machine learning   support vector machinesMachine learning   support vector machines
Machine learning support vector machines
 

Similar to Demystifying dependency Injection: Dagger and Toothpick

Java.lang.object
Java.lang.objectJava.lang.object
Java.lang.object
Soham Sengupta
 
Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...
Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...
Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...
argsstring
 
2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests
Tomek Kaczanowski
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
Julie Iskander
 
Architecure components by Paulina Szklarska
Architecure components by Paulina SzklarskaArchitecure components by Paulina Szklarska
Architecure components by Paulina Szklarska
Women in Technology Poland
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
LearningTech
 
The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe Groovy Way of Testing with Spock
The Groovy Way of Testing with Spock
Naresha K
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Codemotion
 
Object-Oriented JavaScript
Object-Oriented JavaScriptObject-Oriented JavaScript
Object-Oriented JavaScript
kvangork
 
Object-Oriented Javascript
Object-Oriented JavascriptObject-Oriented Javascript
Object-Oriented Javascript
kvangork
 
OOP Lab Report.docx
OOP Lab Report.docxOOP Lab Report.docx
OOP Lab Report.docx
ArafatSahinAfridi
 
Design patterns in javascript
Design patterns in javascriptDesign patterns in javascript
Design patterns in javascriptMiao Siyu
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTruls Jørgensen
 
JavaScript Classes and Inheritance
JavaScript Classes and InheritanceJavaScript Classes and Inheritance
JavaScript Classes and Inheritance
marcheiligers
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
whitneyleman54422
 
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
Simon Su
 
Js 单元测试框架介绍
Js 单元测试框架介绍Js 单元测试框架介绍
Js 单元测试框架介绍louieuser
 
Having a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfHaving a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdf
NicholasflqStewartl
 

Similar to Demystifying dependency Injection: Dagger and Toothpick (20)

Java.lang.object
Java.lang.objectJava.lang.object
Java.lang.object
 
Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...
Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...
Java for the Impatient, Java Constructors, Scope, Wrappers, Inheritance, and ...
 
2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
Architecure components by Paulina Szklarska
Architecure components by Paulina SzklarskaArchitecure components by Paulina Szklarska
Architecure components by Paulina Szklarska
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
 
The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe Groovy Way of Testing with Spock
The Groovy Way of Testing with Spock
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
 
Object-Oriented JavaScript
Object-Oriented JavaScriptObject-Oriented JavaScript
Object-Oriented JavaScript
 
Object-Oriented Javascript
Object-Oriented JavascriptObject-Oriented Javascript
Object-Oriented Javascript
 
Rd
RdRd
Rd
 
OOP Lab Report.docx
OOP Lab Report.docxOOP Lab Report.docx
OOP Lab Report.docx
 
Design patterns in javascript
Design patterns in javascriptDesign patterns in javascript
Design patterns in javascript
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
 
JavaScript Classes and Inheritance
JavaScript Classes and InheritanceJavaScript Classes and Inheritance
JavaScript Classes and Inheritance
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
 
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
 
Js 单元测试框架介绍
Js 单元测试框架介绍Js 单元测试框架介绍
Js 单元测试框架介绍
 
Having a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfHaving a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdf
 

More from Danny Preussler

We aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiWe aint got no time - Droidcon Nairobi
We aint got no time - Droidcon Nairobi
Danny Preussler
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)
Danny Preussler
 
TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)
Danny Preussler
 
TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)
Danny Preussler
 
Junit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindJunit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behind
Danny Preussler
 
All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...
Danny Preussler
 
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
Danny Preussler
 
Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)
Danny Preussler
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)
Danny Preussler
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzles
Danny Preussler
 
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinAbgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Danny Preussler
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)
Danny Preussler
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
Danny Preussler
 

More from Danny Preussler (13)

We aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiWe aint got no time - Droidcon Nairobi
We aint got no time - Droidcon Nairobi
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)
 
TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)
 
TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)
 
Junit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindJunit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behind
 
All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...
 
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
 
Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzles
 
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinAbgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
 

Recently uploaded

Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 

Recently uploaded (20)

Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 

Demystifying dependency Injection: Dagger and Toothpick

Editor's Notes

  1. A code base, one activity, needed a tracker Needed in in a testable way
  2. A code base, one activity, needed a tracker Needed in in a testable way
  3. A code base, one activity, needed a tracker Needed in in a testable way
  4. A code base, one activity, needed a tracker Needed in in a testable way
  5. A code base, one activity, needed a tracker Needed in in a testable way
  6. A code base, one activity, needed a tracker Needed in in a testable way
  7. Same as before
  8. Same as before
  9. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  10. Known as @Inject
  11. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  12. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  13. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  14. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  15. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  16. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  17. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  18. Same as before
  19. Same as before
  20. Same as before
  21. Same as before
  22. Same as before
  23. Same as before
  24. Same as before
  25. Same as before
  26. Same as before
  27. Same as before
  28. RobGuice
  29. RobGuice
  30. Cheated a bit with some newer reflection methods
  31. Google slide NOI
  32. Problem google said don’t use Relfection is slow!
  33. Problem google said don’t use Relfection is slow!
  34. Problem google said don’t use Relfection is slow!
  35. Problem google said don’t use Relfection is slow!
  36. Add street figher
  37. Not in JSR
  38. Google slide NOI
  39. Same!
  40. Same!
  41. Lets try anway
  42. Lets try anway
  43. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused
  44. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused
  45. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused
  46. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused