首页 > 解决方案 > 如何创建基于类型或类对象生成对象的工厂?

问题描述

在我的 Kotlin 应用程序中,我有一些实体(以及每个实体的数据类),并且对于每个实体,我都有一个实现通用Service<T>接口的服务对象。
我想创建一个服务工厂,它将根据参数返回一个适当的服务,该参数是我想要为其提供服务的实体类型。在Java中,我会将一个Class对象传递给工厂,我可以从实体类的静态上下文中获取该对象,例如。Entity.class但我不能在 Kotlin 中做到这一点。我如何创建一个工厂,它将根据实体类型为我生成对象?

标签: kotlinfactory

解决方案


您正在寻找KClass

假设您有以下课程:

abstract class Parent(val name: String)
class ChildA : Parent("A")
class ChildB : Parent("B")

那么你的工厂可能看起来像这样:

fun <T : Any> factory(c: KClass<T>): T {
     return c.createInstance()
}

fun main(args: Array<String>) {

     val childA = factory(ChildA::class)
     val childB = factory(ChildB::class)

     println(childA.name) // A
     println(childB.name) // B
}

但是有一个更好的方法使用reified

inline fun <reified T : Any> factory(): T {
     return T::class.createInstance()
}

然后你可以这样称呼它:

 val childA = factory<ChildA>()
 val childB = factory<ChildB>()

 println(childA.name)
 println(childB.name)

请注意,如果不使用,reified我们将无法做到T::class


推荐阅读