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
Ad

More Related Content

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
Graham 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
Spock
Evgeny Borisov
 
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 2011
Anton 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 Spock
Dmitry 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
 
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
Graham 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
 
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 2011
Anton 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
 
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 Spock
Dmitry Voloshko
 
Spock: Test Well and Prosper
Spock: Test Well and ProsperSpock: Test Well and Prosper
Spock: Test Well and Prosper
Ken Kousen
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for Programmers
David Rodenas
 

Viewers also liked (20)

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 computing
swati 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 queues
zukun
 
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 Processing
Sabnam 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
 
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 .
 
Interfaces to ubiquitous computing
Interfaces to ubiquitous computingInterfaces to ubiquitous computing
Interfaces to ubiquitous computing
swati sonawane
 
iBeacons: Security and Privacy?
iBeacons: Security and Privacy?iBeacons: Security and Privacy?
iBeacons: Security and Privacy?
Jim Fenton
 
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 queues
zukun
 
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 Processing
Sabnam 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
 
Ad

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

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 JFokus
HamletDRC
 
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
 
Rd
RdRd
Rd
Indrasena Reddy
 
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 javascript
Miao Siyu
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
Truls 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
 
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
 
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 JFokus
HamletDRC
 
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
 
Design patterns in javascript
Design patterns in javascriptDesign patterns in javascript
Design patterns in javascript
Miao Siyu
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
Truls 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
 
Ad

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
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
 
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
 

Recently uploaded (20)

AsyncAPI v3 : Streamlining Event-Driven API Design
AsyncAPI v3 : Streamlining Event-Driven API DesignAsyncAPI v3 : Streamlining Event-Driven API Design
AsyncAPI v3 : Streamlining Event-Driven API Design
leonid54
 
Com fer un pla de gestió de dades amb l'eiNa DMP (en anglès)
Com fer un pla de gestió de dades amb l'eiNa DMP (en anglès)Com fer un pla de gestió de dades amb l'eiNa DMP (en anglès)
Com fer un pla de gestió de dades amb l'eiNa DMP (en anglès)
CSUC - Consorci de Serveis Universitaris de Catalunya
 
Canadian book publishing: Insights from the latest salary survey - Tech Forum...
Canadian book publishing: Insights from the latest salary survey - Tech Forum...Canadian book publishing: Insights from the latest salary survey - Tech Forum...
Canadian book publishing: Insights from the latest salary survey - Tech Forum...
BookNet Canada
 
UiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer OpportunitiesUiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer Opportunities
DianaGray10
 
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Raffi Khatchadourian
 
Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?
Eric Torreborre
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Raffi Khatchadourian
 
Viam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdfViam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdf
camilalamoratta
 
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptxWebinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
MSP360
 
Unlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web AppsUnlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web Apps
Maximiliano Firtman
 
fennec fox optimization algorithm for optimal solution
fennec fox optimization algorithm for optimal solutionfennec fox optimization algorithm for optimal solution
fennec fox optimization algorithm for optimal solution
shallal2
 
Cybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and MitigationCybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and Mitigation
VICTOR MAESTRE RAMIREZ
 
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Markus Eisele
 
Q1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor PresentationQ1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor Presentation
Dropbox
 
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptxReimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
John Moore
 
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptxSmart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Seasia Infotech
 
machines-for-woodworking-shops-en-compressed.pdf
machines-for-woodworking-shops-en-compressed.pdfmachines-for-woodworking-shops-en-compressed.pdf
machines-for-woodworking-shops-en-compressed.pdf
AmirStern2
 
Kit-Works Team Study_아직도 Dockefile.pdf_김성호
Kit-Works Team Study_아직도 Dockefile.pdf_김성호Kit-Works Team Study_아직도 Dockefile.pdf_김성호
Kit-Works Team Study_아직도 Dockefile.pdf_김성호
Wonjun Hwang
 
IT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information TechnologyIT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information Technology
SHEHABALYAMANI
 
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdfKit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Wonjun Hwang
 
AsyncAPI v3 : Streamlining Event-Driven API Design
AsyncAPI v3 : Streamlining Event-Driven API DesignAsyncAPI v3 : Streamlining Event-Driven API Design
AsyncAPI v3 : Streamlining Event-Driven API Design
leonid54
 
Canadian book publishing: Insights from the latest salary survey - Tech Forum...
Canadian book publishing: Insights from the latest salary survey - Tech Forum...Canadian book publishing: Insights from the latest salary survey - Tech Forum...
Canadian book publishing: Insights from the latest salary survey - Tech Forum...
BookNet Canada
 
UiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer OpportunitiesUiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer Opportunities
DianaGray10
 
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Raffi Khatchadourian
 
Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?
Eric Torreborre
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Raffi Khatchadourian
 
Viam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdfViam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdf
camilalamoratta
 
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptxWebinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
MSP360
 
Unlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web AppsUnlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web Apps
Maximiliano Firtman
 
fennec fox optimization algorithm for optimal solution
fennec fox optimization algorithm for optimal solutionfennec fox optimization algorithm for optimal solution
fennec fox optimization algorithm for optimal solution
shallal2
 
Cybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and MitigationCybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and Mitigation
VICTOR MAESTRE RAMIREZ
 
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Markus Eisele
 
Q1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor PresentationQ1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor Presentation
Dropbox
 
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptxReimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
John Moore
 
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptxSmart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Seasia Infotech
 
machines-for-woodworking-shops-en-compressed.pdf
machines-for-woodworking-shops-en-compressed.pdfmachines-for-woodworking-shops-en-compressed.pdf
machines-for-woodworking-shops-en-compressed.pdf
AmirStern2
 
Kit-Works Team Study_아직도 Dockefile.pdf_김성호
Kit-Works Team Study_아직도 Dockefile.pdf_김성호Kit-Works Team Study_아직도 Dockefile.pdf_김성호
Kit-Works Team Study_아직도 Dockefile.pdf_김성호
Wonjun Hwang
 
IT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information TechnologyIT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information Technology
SHEHABALYAMANI
 
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdfKit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Wonjun Hwang
 

Demystifying dependency Injection: Dagger and Toothpick

Editor's Notes

  • #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
  • #6: A code base, one activity, needed a tracker Needed in in a testable way
  • #7: A code base, one activity, needed a tracker Needed in in a testable way
  • #8: A code base, one activity, needed a tracker Needed in in a testable way
  • #9: A code base, one activity, needed a tracker Needed in in a testable way
  • #33: Same as before
  • #34: Same as before
  • #37: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #40: Known as @Inject
  • #41: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #42: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #43: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #44: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #45: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #46: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #47: Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  • #48: Same as before
  • #49: Same as before
  • #52: Same as before
  • #53: Same as before
  • #54: Same as before
  • #55: Same as before
  • #56: Same as before
  • #57: Same as before
  • #58: Same as before
  • #59: Same as before
  • #61: RobGuice
  • #62: RobGuice
  • #63: Cheated a bit with some newer reflection methods
  • #64: Google slide NOI
  • #65: Problem google said don’t use Relfection is slow!
  • #66: Problem google said don’t use Relfection is slow!
  • #67: Problem google said don’t use Relfection is slow!
  • #68: Problem google said don’t use Relfection is slow!
  • #74: Add street figher
  • #80: Not in JSR
  • #83: Google slide NOI
  • #85: Same!
  • #87: Same!
  • #91: Lets try anway
  • #92: Lets try anway
  • #117: 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
  • #118: 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
  • #119: 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
  • #120: 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
  翻译: