android - 在 Android 上使用 Kotlin 动态填充实例化类的列表
问题描述
我有一个抽象类,某些包中的所有类都派生自它。在 Android 上使用 Kotlin 时,有没有办法创建一个动态实例化位于某个包中的所有这些类的列表?
这是一个例子:
- com.example.service
- 基本服务
- com.example.service.emailservice
- Gmail服务
- Outlook服务
com.example.service.emailservice 中的所有类都派生自 com.example.service 中的 BaseService 抽象类。我想创建一个包含 GmailService 和 OutlookService 对象的列表。我可以手动实例化它们并将它们添加到列表中,但将来我可能会添加新服务,比如 YandexService,它也应该出现在列表中。这需要再次手动实例化。有没有办法自动实例化驻留在某个包中的类?
解决方案
有两种市长方法可以做到这一点。
第一个 - 更容易和更脏的称为反射。您可能会在 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() }
这与您所拥有的并没有太大的不同,并且可能需要对您的服务和应用程序整体进行一些逻辑和架构更改,但它不会很脏,也不需要巨大的学习曲线和时间成本。
希望能帮助到你。