首页 > 解决方案 > 在 Android 上使用 Kotlin 动态填充实例化类的列表

问题描述

我有一个抽象类,某些包中的所有类都派生自它。在 Android 上使用 Kotlin 时,有没有办法创建一个动态实例化位于某个包中的所有这些类的列表?

这是一个例子:

com.example.service.emailservice 中的所有类都派生自 com.example.service 中的 BaseService 抽象类。我想创建一个包含 GmailService 和 OutlookService 对象的列表。我可以手动实例化它们并将它们添加到列表中,但将来我可能会添加新服务,比如 YandexService,它也应该出现在列表中。这需要再次手动实例化。有没有办法自动实例化驻留在某个包中的类?

标签: androidkotlin

解决方案


有两种市长方法可以做到这一点。

第一个 - 更容易和更脏的称为反射。您可能会在 java 中找到很多示例。虽然在 Kotlin 中没有那么多,但从我在这里读到的内容来看,这是不可能的。但是,不建议在生产中使用反射,并且通常被认为是完成某些事情的糟糕方法。

第二种方式是注释处理器——这种方式更难。虽然它被认为是完成此类任务的一种干净方式,但它是代码生成技术的通用标准。这样一来,只要你下定决心,你就可以施展各种魔法。是关于如何做到这一点的好文章。

一般来说,我会建议使用半自动方法。

例如:在您的基础服务中使用 init 方法

abstract class BaseService {

     abstract fun init(): BaseService

}

让你的所有服务都实现这个 BaseService

class Service : BaseService() {

     override fun init(): BaseService {
         return Service()
     }

}
...

然后只需创建一个类列表

val services = listOf(Service(), Service1(), Service2())

并初始化它们

services.forEach { it.init() }

这与您所拥有的并没有太大的不同,并且可能需要对您的服务和应用程序整体进行一些逻辑和架构更改,但它不会很脏,也不需要巨大的学习曲线和时间成本。

希望能帮助到你。


推荐阅读