在学习依赖注入时,我发现有些方法建议注入所有内容,而其他方法则认为不必如此。
在我的当前项目中,我对于依赖注入的原则是“如果该类是由我创建的,则使其可注入”。换句话说,只有像
我最初使用DI,因为我认为它可以提高性能和内存使用率,一旦
第一个问题是:
这种方法的一个示例是以下类:
第二个问题是:
注入一切在Android中是否是一个不好的实践?
如果第二个问题的答案为“否”,是否有更好的方法来处理非参数构造函数以创建类?因为当我创建一个带有@Inject注释的无参构造函数并且一个类需要一些参数才能工作时,我必须使用setters:
所有参数都可以在构造函数中设置,一次性在流程中获取。
在我的当前项目中,我对于依赖注入的原则是“如果该类是由我创建的,则使其可注入”。换句话说,只有像
SimpleDateFormat
、ArrayList
和HashMap
这样的类是可实例化的。我采用这种方法的目的是,一旦在Activity
中调用Injector.getApplicationComponent().inject(this)
,就可以在任何地方@Inject
任何类。基本上,我的所有类都具有带有@Inject
的无参构造函数。我最初使用DI,因为我认为它可以提高性能和内存使用率,一旦
new
操作符只由Dagger生成的类使用。但我读到了Dagger 1开发人员的post,说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;
}
所有参数都可以在构造函数中设置,一次性在流程中获取。
LinearLayoutManager
)。 - EpicPandaForce