热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Android中"注入一切"是一种不好的做法吗?

如何解决《在Android中"注入一切"是一种不好的做法吗?》经验,为你挑选了1个好方法。

关于依赖注入的研究我发现一些方法建议注入所有东西,而另一些方法则说没有必要这样做.

在我目前的项目中,关于依赖注入的经验法则是" 如果该类是由我创建的,那么我可以将其注入 ".换句话说只有类喜欢SimpleDateFormat,ArrayList,HashMap是在我的项目newables.我的意图这样做的方法是,我可以@Inject任意类的任意一次调用Injector.getApplicationComponent().inject(this)Activity.基本上我的所有类都有一个非args构造函数@Inject.

我主要使用DI,因为我认为一旦newDagger生成的类专门使用运算符,它将改善性能和内存使用.但我读了Dagger 1开发人员的帖子,说DI对性能没有影响,用法基本上是为了减少样板.

第一个问题是:

Dagger 2在Android应用程序中没有任何性能优势?

我的项目运行没有问题,我认为"注入一切"的方法有助于更好地组织,尽管有一些缺点.

使用此方法的一个示例是以下类:

public class TimelineEntryAdapter {

@Inject
Provider mTwitterProvider;

@Inject
Provider mInstagramProvider;

@Inject
Provider mFacebookProvider;

@Inject
TimelineEntryComparator mComparator;

@Inject
public TimelineEntryAdapter() {
}

第二个问题是:

在Android中注入所有东西是不好的做法?

如果第二个问题的答案是"否",那么有一种更好的方法来处理非args构造函数来创建类吗?因为当我创建一个带有@Inject注释的非args构造函数并且类需要一些参数来使用时,我必须使用setters:

public class SavelArtist {

private MusicBrainzArtist mMusicBrainzArtist;

private DiscogsArtist mDiscogsArtist;

private List mTweetList;

private SpotifyArtist mSpotifyArtist;

private List mInstaTimeline;

private List mFacebookTimeline;

private List mReleases;

@Inject
Provider mReleaseProvider;

@Inject
public SavelArtist() {
}

public void setMusicBrainzArtist(MusicBrainzArtist mbArtist) {
    mMusicBrainzArtist = mbArtist;
}

public void setDiscogsArtist(DiscogsArtist discogsArtist) {
    mDiscogsArtist = discogsArtist;
}

public void setTweetList(List tweetList) {
    mTweetList = tweetList;
}

public void setSpotifyArtist(SpotifyArtist spotifyArtist) {
    mSpotifyArtist = spotifyArtist;
}

public void setInstaTimeline(List instaTimeline) {
    mInstaTimeline = instaTimeline;
}

public void setFacebookTimeline(List fbTimeline) {
    mFacebookTimeline = fbTimeline;
}

一旦所有参数在流程中同时获得,所有参数都可以在构造函数上设置.



1> David Rawson..:

关于依赖注入的研究我发现一些方法建议注入所有东西,而另一些方法则说没有必要这样做.

您引用的froger_mcs博客条目并不主张注入所有内容.它非常明确地指出:

这篇文章的目的是展示我们可以做什么,而不是我们该做什么.

它继续说明注入一切的缺点:

如果您想在项目中使用Dagger 2几乎所有内容,您很快就会看到生成的代码用于注入的64k方法计数限制.

现在,问你的问题:

Dagger 2在Android应用程序中没有任何性能优势?

虽然Dagger 2提供了优于其他基于反射的DI框架(例如Guice)的性能优势,但它并不声称通过调用构造函数来手动构建对象图提供任何性能优势.您可以自己检查生成的类,看看这些确实最终仍然调用构造函数.

在Android中注入所有东西是不好的做法?

好吧,让我们采取以下非常常见的Android代码:

Intent nextActivity = new Intent(this, NextActivity.class);
startActivity(nextActivity);

我们应该IntentFactory使用Dagger 2 提取并注入它,仅仅是为了避免使用new关键字吗?在这一点上,很容易接近迂腐.您引用的另一个答案中关于注射剂和新品之间差异的建议更灵活,更优雅.

继续你的下一个问题:

如果第二个问题的答案是"否",那么有一种更好的方法来处理非args构造函数来创建类吗?因为当我用@Inject注释创建一个非args构造函数并且一个类需要一些参数来处理时,我必须使用setter:

使用setter是参数的错误方法.您应该区分依赖项参数.依赖关系通常与对象本身具有相同的生命周期.在对象的生命周期中,可以使用不同的参数调用为该对象公开的方法.


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • #前言AndroidArchitectureComponents是谷歌在GoogleIO2017发布的。官方的描述:https:developer.android.google.c ... [详细]
author-avatar
H_debug
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有