在 Android 中“注入所有内容”是一种不好的做法吗?

2024-04-26

在研究依赖注入时,我发现了一些建议的方法注入一切 http://frogermcs.github.io/inject-everything-viewholder-and-dagger-2-example/和其他人说没有必要这样做 https://stackoverflow.com/a/37517764/6100078.

在我当前的项目中,我关于依赖注入的经验法则是“如果该类是我创建的,我将其设置为可注入“。换句话说,只有像这样的类SimpleDateFormat, ArrayList, HashMap是我的项目中的新事物。我这样做的目的是我可以@Inject任何地方的任何班级一次调用Injector.getApplicationComponent().inject(this) in the Activity。基本上我所有的类都有一个非参数构造函数@Inject.

我最初使用 DI 是因为我认为一旦使用 DI 将会提高性能和内存使用率new运算符仅由 Dagger 生成的类使用。但我读了一篇post https://stackoverflow.com/a/21544630/6100078Dagger 1 开发人员表示 DI 对性能没有影响,使用基本上是为了减少样板文件。

第一个问题是:

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

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

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

public class TimelineEntryAdapter {

@Inject
Provider<TwitterEntry> mTwitterProvider;

@Inject
Provider<InstagramEntry> mInstagramProvider;

@Inject
Provider<FacebookEntry> mFacebookProvider;

@Inject
TimelineEntryComparator mComparator;

@Inject
public TimelineEntryAdapter() {
}

第二个问题是:

  • 在 Android 中注入所有内容是一种不好的做法吗?

如果第二个问题的答案是“否”,是否有更好的方法来处理非参数构造函数来创建类?因为当我创建一个非参数构造函数时@Inject注释和类需要一些参数才能使用,我必须使用setters:

public class SavelArtist {

private MusicBrainzArtist mMusicBrainzArtist;

private DiscogsArtist mDiscogsArtist;

private List<SavelTweet> mTweetList;

private SpotifyArtist mSpotifyArtist;

private List<SavelInstagram> mInstaTimeline;

private List<SavelFacebook> mFacebookTimeline;

private List<SavelRelease> mReleases;

@Inject
Provider<SavelRelease> mReleaseProvider;

@Inject
public SavelArtist() {
}

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

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

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

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

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

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

一旦在流程中同时获取所有参数,就可以在构造函数上设置所有参数。


在研究依赖注入时,我发现一些方法建议注入所有内容,而另一些方法则认为没有必要这样做。

The froger_mcs 博客条目 http://frogermcs.github.io/inject-everything-viewholder-and-dagger-2-example/您引用的内容并不提倡注入所有内容。它非常明确地指出:

这篇文章的目的是展示我们can做,不是我们做的should do.

它还指出了注入所有内容的缺点:

如果您想将 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关键字在这里?在这一点上,很容易走上迂腐之路。中的建议其他答案你引用 https://stackoverflow.com/a/37517764/6100078关于注射剂和新剂之间的区别更加灵活和优雅。

继续你的下一个问题:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中“注入所有内容”是一种不好的做法吗? 的相关文章

  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A

随机推荐