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

kotlin中的Dagger2静态提供程序方法

如何解决《kotlin中的Dagger2静态提供程序方法》经验,为你挑选了3个好方法。

对于最近版本的匕首2,所做的改进之一是具有静态提供方法的可能性.简单地说:

@Provides
static A providesA() {
  return A();
}

我想知道如何在kotlin做这件事?我试过了

@Module
class AModule {
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }
}

但我收到错误消息:

@Provides methods can only be present within a @Module or @ProducerModule

我猜这里有同伴对象,但是我对Kotlin很新,我不确定如何做到这一点.它甚至可能吗?

谢谢!



1> Omar Al Hala..:

虽然我认为zsmb13的解决方案更好,但我找到了另一种解决方案

@Module
class AModule {
  @Module
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }

  // add other non-static provides here
}

但是请注意,将有两个生成的类:AModule_ProvidesAFactoryAModule_Companion_ProvidesAFactory而不是一个AModule_ProvidesAFactory用于与对象,而不是一类与同伴对象的情况下类


如果模块类中同时存在静态提供程序方法和"@Binds"注释方法,则接受的答案将不起作用,而此答案适用于这两种情况.
实际上,@ zsmb13的解决方案对我不起作用,您的对我来说无效。
这也很好,因为AModule可以是抽象的

2> zsmb13..:

我现在无法测试它,但我认为这应该有效:

@Module
object AModule {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
}


但是有了"对象",它会不会让这个单例类太久了?刚刚使用内存转储测试,甚至在杀死活动并将其从堆中完全删除后,我仍然在内存中存在"对象AModule",这不是我们想要的......
我不认为这个解决方案效果很好,因为使你的AModule"对象"不是"类"会在应用程序周围创建很多单例模块,即使你不再需要这个模块实例它们也会存在,例如你有屏幕范围.一旦你访问你的屏幕,将创建模块单例,它将永远不会被清理,因为它是"对象"

3> sophia..:

似乎是谷歌批准的一个很好的解释是https://github.com/google/dagger/issues/900

具体来说,请看:

静态提供可以通过@JvmStatic实现.我看到有两种情况出现:

顶级object

@Module object DataModule {   
  @JvmStatic @Provides fun 
    provideDiskCache() = DiskCache() 
} 

如果你有一个现有的类模块,事情会有点怪异

@Module abstract class DataModule {   
    @Binds abstract fun provideCache(diskCache: DiskCache): Cache

    @Module   
    companion object {
        @JvmStatic @Provides fun provideDiskCache() = DiskCache()   
    } 
} 

这种方式的工作方式如下:

伴随对象也必须在引擎盖下注释为@Module,kotlin编译器会将这些静态提供方法复制到DataModule类中.匕首会看到那些并将它们视为常规静态场.Dagger也会在伴侣对象中看到它们,但是"模块"将从匕首获得代码,但被标记为"未使用".IDE将这样标记,因为provideDiskCache方法将被标记为未使用.您可以告诉IntelliJ忽略这个注释,注释使用@Provides通过quickfix注释


推荐阅读
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 子类从父类继承所有的成员(字段,方法,嵌套类),构造方法不属于成员,所有子类不能继承,但是子类可以调用父类的构造方法对于private方法和属性,子类一定是继承了的,但是没有访问权 ... [详细]
  • Android Studio中使用apt
    AndroidStudio中使用apt一、前言你还在对着枯燥的重复代码一味复制粘贴吗?这样跟搬砖有何区别?你是否曾想过:你用代码编写出一个自动化的APP,但为何代码本身却缺少了活力 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
author-avatar
sunsnowswift
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有