如何创建一个基于类型或类对象生成对象的工厂?

时间:2018-08-05 15:48:47

标签: kotlin factory

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

1 个答案:

答案 0 :(得分:1)

您正在寻找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