<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>How to Optimize Dagger Module | Infinum</title>
		<atom:link href="https://infinum.com/blog/how-to-optimize-dagger-module/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/how-to-optimize-dagger-module/</link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 03 Apr 2026 12:58:20 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>7946https://infinum.com/uploads/2020/05/how-to-optimize-dagger-module-0.webp</url>
				</image>
				<title>How to Optimize Dagger Module</title>
				<link>https://infinum.com/blog/how-to-optimize-dagger-module/</link>
				<pubDate>Fri, 22 May 2020 15:38:00 +0000</pubDate>
				<dc:creator>Branimir Akmadža</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/how-to-optimize-dagger-module/</guid>
				<description>
					<![CDATA[<p>Make small changes in the code to shorten the build time consumed by dependency injection. Ready?</p>
<p>The post <a href="https://infinum.com/blog/how-to-optimize-dagger-module/">How to Optimize Dagger Module</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-287"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	Do you know why Android developers learn JS? Because they need something to do while <a href="https://infinum.com/blog/i-cheated-on-android-with-javascript-and-my-boss-approved/">waiting for the app to build</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	If you are an Android developer, you are most probably familiar with experiencing long build times. Long build times slow down your development process, and nobody likes it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	Especially in situations when you are debugging some nasty bug, you don’t want to wait until your focus on a solution is gone.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-102">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-103'
	>
	An alternative solution to learning JS</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	A lot of build time is consumed by annotation processor tools of some kind. A big part of that build time consumption is used by dependency injection.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-109'
	>
	Since Dagger is the most popular dependency injector and is used in most modern projects, it made sense to take a deeper look and see if we can somehow optimize it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-111">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-112'
	>
	It turned out that making a simple change can significantly improve build time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-114">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-115'
	>
	Use @Binds instead of @Provides</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-117">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-118'
	>
	To understand why this is an improvement, we need to take a look at the code that is being generated when using <code>@Provides</code> method.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-120">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-121'
	>
	For this purpose, I have created a simple example, <code>HelpersModule</code> which provides <code>StringManager</code>. <code>StringManager</code> is simply a helper object used to provide you strings in presenters or view models without directly exposing Context.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-123">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-124'
	>
	But back to the Dagger, take a look at our <code>HelpersModule</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-127"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Module</span><span class="token">
</span></span><span class="line"><span class="token">class HelpersModule </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Provides</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> </span><span class="token">fun stringProvider</span><span class="token">(context</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Context</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManager</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">StringManagerImpl</span><span class="token">(context.resources)
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-128">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-129'
	>
	We have annotated a method that gives us a concrete implementation of a wanted object using <code>@Provides</code> annotation, sounds good right?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-133"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-131">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-132'
	>
	Actually, it is a bit more than this. Under the hood, Dagger needs to generate a completely new factory class for this.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-136"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-134">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-135'
	>
	Take a look:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-138"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">final</span><span class="token"> </span><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">HelpersModule_StringProviderFactory</span><span class="token"> </span><span class="token" style="color: #d73a49;">implements</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Factory</span><span class="token">&lt;</span><span class="token" style="color: #d73a49;">StringManager</span><span class="token">&gt;</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">final</span><span class="token"> </span><span class="token" style="color: #24292e;">HelpersModule</span><span class="token"> </span><span class="token" style="color: #24292e;">module</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">final</span><span class="token"> </span><span class="token" style="color: #24292e;">Provider</span><span class="token">&lt;</span><span class="token" style="color: #d73a49;">Context</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #24292e;">contextProvider</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #6f42c1;">HelpersModule_StringProviderFactory</span><span class="token">(</span><span class="token" style="color: #24292e;">HelpersModule</span><span class="token"> </span><span class="token" style="color: #e36209;">module</span><span class="token">,</span><span class="token" style="color: #24292e;">Provider</span><span class="token">&lt;</span><span class="token" style="color: #d73a49;">Context</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #e36209;">contextProvider</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">module</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> module</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">contextProvider</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> contextProvider</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">@</span><span class="token" style="color: #d73a49;">Override</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #24292e;">StringManager</span><span class="token"> </span><span class="token" style="color: #6f42c1;">get</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #6f42c1;">stringProvider</span><span class="token">(</span><span class="token">module</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">contextProvider</span><span class="token">.</span><span class="token" style="color: #6f42c1;">get</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token" style="color: #24292e;">HelpersModule_StringProviderFactory</span><span class="token"> </span><span class="token" style="color: #6f42c1;">create</span><span class="token">(</span><span class="token" style="color: #24292e;">HelpersModule</span><span class="token"> </span><span class="token" style="color: #e36209;">module</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">Provider</span><span class="token">&lt;</span><span class="token" style="color: #d73a49;">Context</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #e36209;">contextProvider</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">HelpersModule_StringProviderFactory</span><span class="token">(</span><span class="token">module</span><span class="token">,</span><span class="token"> contextProvider</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token" style="color: #24292e;">StringManager</span><span class="token"> </span><span class="token" style="color: #6f42c1;">stringProvider</span><span class="token">(</span><span class="token" style="color: #24292e;">HelpersModule</span><span class="token"> </span><span class="token" style="color: #e36209;">instance</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">Context</span><span class="token"> </span><span class="token" style="color: #e36209;">context</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #24292e;">Preconditions</span><span class="token">.</span><span class="token" style="color: #6f42c1;">checkNotNull</span><span class="token">(</span><span class="token" style="color: #24292e;">instance</span><span class="token">.</span><span class="token" style="color: #6f42c1;">stringProvider</span><span class="token">(</span><span class="token">context</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Cannot return null from a non-@Nullable @Provides method</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-141"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-139">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-140'
	>
	If you read this factory class line by line you can figure out more or less what is going on.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-144"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-142">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-143'
	>
	In simple words, it is nothing more than a Java representation of what we have taken for granted while writing <code>HelpersModule</code>. The main point is that <strong><code>provides</code> annotation will generate a class</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-147"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-145">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-146'
	>
	Let’s try to write this identical thing using @Binds annotation:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Module</span><span class="token">
</span></span><span class="line"><span class="token">interface HelpersModule </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Binds</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> 
</span></span><span class="line"><span class="token">    </span><span class="token">fun stringProvider</span><span class="token">(stringManagerImpl</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManagerImpl</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManager</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-150">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-151'
	>
	If you try to make a build now, you’ll see an expected error:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">error</span><span class="token">: </span><span class="token">[Dagger</span><span class="token" style="color: #d73a49;">/</span><span class="token">MissingBinding] android.content.res.Resources cannot be provided without an </span><span class="token" style="color: #6f42c1;">@Inject</span><span class="token"> constructor or an </span><span class="token" style="color: #6f42c1;">@Provides</span><span class="token" style="color: #d73a49;">-</span><span class="token">annotated method.
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-155">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-156'
	>
	We forgot to provide <code>Resources</code> object to <code>StringManager</code>. Let’s be naive and create a new <code>@Binds</code> annotated method which will provide resources.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Module</span><span class="token">
</span></span><span class="line"><span class="token">interface HelpersModule </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Binds</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> 
</span></span><span class="line"><span class="token">    </span><span class="token">fun resourcesProvider</span><span class="token">(context</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Context</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Resources</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> context.resources
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Binds</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> 
</span></span><span class="line"><span class="token">    </span><span class="token">fun stringProvider</span><span class="token">(stringManagerImpl</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManagerImpl</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManager</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-160">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-161'
	>
	Here’s what happens:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-164"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">error</span><span class="token">: </span><span class="token" style="color: #6f42c1;">@Binds</span><span class="token"> methods’ parameter type must be assignable to the </span><span class="token" style="color: #d73a49;">return</span><span class="token"> type
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-165">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-166'
	>
	And that is exactly the difference between <code>@Provides</code> and <code>@Binds</code> annotations. <code>@Binds</code> annotation must be assignable to the return type. What does it mean?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-168">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-169'
	>
	In order to enable the injection of some object that needs something itself, like <code>StringManager</code> needed Resources, we need to have all of these atomic objects provided somewhere.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-171">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-172'
	>
	In this example, we needed to provide resources using the <code>@Provides</code> annotated method.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-175"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Module</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">abstract</span><span class="token"> </span><span class="token">class HelpersModule </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Provides</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> 
</span></span><span class="line"><span class="token">    </span><span class="token">fun resourcesProvider</span><span class="token">(</span><span class="token" style="color: #6f42c1;">@AppContext</span><span class="token"> context</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Context</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Resources</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> context.resources
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Binds</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> 
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">abstract</span><span class="token"> </span><span class="token">fun stringProvider</span><span class="token">(stringManagerImpl</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManagerImpl</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManager</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-178"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-176">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-177'
	>
	Notice how I had to change our interface into abstract class in order to keep the method that has implementation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-179">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-180'
	>
	This should be fine now. Let’s make a build:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-183"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">error</span><span class="token">: </span><span class="token" style="color: #6f42c1;">A</span><span class="token"> </span><span class="token" style="color: #6f42c1;">@Module</span><span class="token"> may not contain both non</span><span class="token" style="color: #d73a49;">-</span><span class="token">static and </span><span class="token" style="color: #d73a49;">abstract</span><span class="token"> binding methods
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-186"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-184">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-185'
	>
	Ok, that is pretty much straightforward.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-189"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-187">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-188'
	>
	We can make the <code>resourcesProvider</code> method static or move it somewhere else. To keep the code clean, we need to separate different semantic entities.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-192"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-190">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-191'
	>
	For this purpose, I have used my ApplicationModule which should contain those atomic providers. I have put resourcesProvider there. So this is the final setup:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Module</span><span class="token">
</span></span><span class="line"><span class="token">class ApplicationModule </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Provides</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@AppContext</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">fun provideApplicationContext</span><span class="token">(application</span><span class="token">: </span><span class="token" style="color: #6f42c1;">PlaygroundApp</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Context</span><span class="token"> </span><span class="token">{
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> application.applicationContext
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Provides</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">fun resourcesProvider</span><span class="token">(</span><span class="token" style="color: #6f42c1;">@AppContext</span><span class="token"> context</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Context</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Resources</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> context.resources
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">@Module</span><span class="token">
</span></span><span class="line"><span class="token">interface HelpersModule </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Binds</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Singleton</span><span class="token"> 
</span></span><span class="line"><span class="token">    </span><span class="token">fun stringProvider</span><span class="token">(stringManagerImpl</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManagerImpl</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManager</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-195">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-196'
	>
	After we have written this, let’s make a build.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-198">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-199'
	>
	It works!</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-201">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-202'
	>
	Now, we want to see generated class:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-205"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-206">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-207'
	>
	Correct. It does not exist.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-209">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-210'
	>
	Why?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-212">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-213'
	>
	Because there is no need for it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-217"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-215">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-216'
	>
	In compilation time, Dagger uses @Binds annotated methods to check if it can provide the wanted object and to find appropriate <code>Provider</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-220"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-218">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-219'
	>
	Like always, let’s take a look under the hood. So, I have injected <code>StringManager</code> into <code>DashboardViewModel</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-222"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">class DashboardViewModel </span><span class="token" style="color: #6f42c1;">@Inject</span><span class="token"> </span><span class="token">constructor</span><span class="token">(
</span></span><span class="line"><span class="token">    stringManager</span><span class="token">: </span><span class="token" style="color: #6f42c1;">StringManager</span><span class="token">
</span></span><span class="line"><span class="token">) </span><span class="token">: </span><span class="token" style="color: #6f42c1;">BaseViewModel</span><span class="token">&lt;</span><span class="token" style="color: #6f42c1;">Nothing</span><span class="token">, </span><span class="token" style="color: #6f42c1;">DashboardEvent</span><span class="token">&gt;</span><span class="token">() {
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-225"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-223">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-224'
	>
	Dagger needs a factory for this view model. The generated class looks like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">final</span><span class="token"> </span><span class="token">class DashboardViewModel_Factory </span><span class="token">implements </span><span class="token">Factory</span><span class="token">&lt;</span><span class="token" style="color: #6f42c1;">DashboardViewModel</span><span class="token">&gt;</span><span class="token"> </span><span class="token">{
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">final</span><span class="token"> Provider</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">StringManager</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> stringManagerProvider;
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token">DashboardViewModel_Factory</span><span class="token">(Provider</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">StringManager</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> stringManagerProvider) {
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.stringManagerProvider </span><span class="token" style="color: #d73a49;">=</span><span class="token"> stringManagerProvider;
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">@Override</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> DashboardViewModel </span><span class="token" style="color: #d73a49;">get</span><span class="token">() {
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> new </span><span class="token">DashboardViewModel</span><span class="token">(stringManagerProvider</span><span class="token">.get</span><span class="token">());
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> static DashboardViewModel_Factory </span><span class="token">create</span><span class="token">(Provider</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">StringManager</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> stringManagerProvider) {
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> new </span><span class="token">DashboardViewModel_Factory</span><span class="token">(stringManagerProvider);
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> static DashboardViewModel </span><span class="token">newInstance</span><span class="token">(StringManager stringManager) {
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> new </span><span class="token">DashboardViewModel</span><span class="token">(stringManager);
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	As you can see, <code>Provider&lt;StringManager&gt;</code> is all that was needed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-232'
	>
	Maybe you think, “Ok, what did we accomplish here?”.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-234">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-235'
	>
	Very soon, this view model will need many other objects. We will still have one generated factory class. Inside that factory, each injected object will have its <code>Provider&lt;T&gt;</code>. And none of the objects annotated with <code>@Binds</code> annotation will need to have their own generated factory class.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-237">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-238'
	>
	In large-scale projects, this makes a difference. Generating files is what really is consuming <strong>build time</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-240">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-241'
	>
	If you are still wondering where to find <code>Provider&lt;StringManager&gt;</code> and how it is linked to this factory, let’s take a look at the generated <code>DaggerAppComponent</code> class.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-244"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">final</span><span class="token"> </span><span class="token">class DaggerAppComponent </span><span class="token">implements </span><span class="token">AppComponent </span><span class="token">{  
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> Provider</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">Resources</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> resourcesProvider;  
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> Provider</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">StringManagerImpl</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> stringManagerImplProvider;
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> void </span><span class="token">initialize</span><span class="token">(</span><span class="token" style="color: #d73a49;">final</span><span class="token"> ApplicationModule applicationModuleParam,  
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">final</span><span class="token"> ApiModule apiModuleParam, </span><span class="token" style="color: #d73a49;">final</span><span class="token"> PlaygroundApp applicationParam) {
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.resourcesProvider </span><span class="token" style="color: #d73a49;">=</span><span class="token"> DoubleCheck</span><span class="token">.provider</span><span class="token">(ApplicationModule_ResourcesProviderFactory</span><span class="token">.create</span><span class="token">(applicationModuleParam, provideApplicationContextProvider));  
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.stringManagerImplProvider </span><span class="token" style="color: #d73a49;">=</span><span class="token"> StringManagerImpl_Factory</span><span class="token">.create</span><span class="token">(resourcesProvider);  
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.stringProvider </span><span class="token" style="color: #d73a49;">=</span><span class="token"> DoubleCheck</span><span class="token">.provider</span><span class="token">((Provider) stringManagerImplProvider);
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-247"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-245">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-246'
	>
	<code>DaggerAppComponent</code> provides the implementation of all components listed in the <code>AppComponent</code> interface. The<code>DoubleCheck.provider</code> method simply returns a <code>Provider</code> that caches the value from the given delegate provider.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-250"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-248">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-249'
	>
	Use @Binds annotation wherever possible</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-253"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-251">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-252'
	>
	We talked about Dagger module optimization through code examples. I have tested this approach on one of our projects at Infinum.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-256"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-254">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-255'
	>
	I made the changes using three rules:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-257">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-258'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-259'
	>
	I have converted<code>@Binds</code><span style="color: var(--typography-color);font-family: var(--typography-font-family);font-size: var(--typography-font-size);font-weight: var(--typography-font-weight);letter-spacing: var(--typography-letter-spacing)"> to </span><code>@Provides</code><span style="color: var(--typography-color);font-family: var(--typography-font-family);font-size: var(--typography-font-size);font-weight: var(--typography-font-weight);letter-spacing: var(--typography-letter-spacing)"> annotation wherever possible.</span></p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-261">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-262'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-263'
	>
	Whenever I could, <span style="color: var(--typography-color);font-family: var(--typography-font-family);font-size: var(--typography-font-size);font-weight: var(--typography-font-weight);letter-spacing: var(--typography-letter-spacing)">I changed class or abstract class into interface. Interface is convenient because it forces you to use </span><code>@Binds</code><span style="color: var(--typography-color);font-family: var(--typography-font-family);font-size: var(--typography-font-size);font-weight: var(--typography-font-weight);letter-spacing: var(--typography-letter-spacing)"> annotation.</span></p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-268"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-265">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-266'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-267'
	>
	If there were some <span style="color: var(--typography-color);font-family: var(--typography-font-family);font-size: var(--typography-font-size);font-weight: var(--typography-font-weight);letter-spacing: var(--typography-letter-spacing)">methods that required implementation, I moved them into another module.</span></p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-273"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-269">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-270'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-271'
	>
	After applying those changes, I managed to reduce build time by 20%.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-276"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-274">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-275'
	>
	I have also counted generated files for both commit builds, and as expected, for each @Provides -&gt; @Binds conversion there was one generated file less.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-279"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-277">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-278'
	>
	One other benefit is that DaggerAppComponent generated less code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-282"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-280">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-281'
	>
	All of this didn’t take more than 10 minutes.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-283">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-284'
	>
	TL;DR<br>Use <code>@Binds</code> instead of <code>@Provides</code> annotation wherever possible.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/how-to-optimize-dagger-module/">How to Optimize Dagger Module</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>