首页 > 解决方案 > Kotlin:按类生成工厂

问题描述

我们正在尝试在 kotlin 中进行一些通用处理。基本上,对于给定的类,我们想要获取相关的 Builder 对象。ia 对于任何扩展 GenericObject 的对象,我们都需要该对象的 Builder。

interface Builder<T : GenericObject> 
object ConcreteBuilder: Builder<ConcreteObject>

我们需要一个ConcreteBuilderConcreteObject

我们当前的实现是一个 Map:

val map = mapOf<KClass<out GenericObject>, Builder<out GenericObject>>(
    ConcreteObject::class to ConcreteBuilder
)

然后我们可以得到它:

inline fun <reified T : GenericObject> transform(...): T {
    val builder = map[T::class] as Builder<T>
    ...

然而,这不是很好,因为:

有没有更好的方法来实现它?

标签: kotlingenerics

解决方案


地图的包装可以是:

class BuilderMap {

    private val map = mutableMapOf<KClass<out GenericObject>, Builder<out GenericObject>>()

    fun <T: GenericObject> put(key: KClass<T>, value: Builder<T>) {
        map[key] = value
    }
    
    operator fun <T: GenericObject> get(key: KClass<T>): Builder<T> {
        return map[key] as Builder<T>
    }
    
}

这隐藏了丑陋,而不是完全消除它。

要使用:

val builderMap = BuilderMap()
builderMap.put(ConcreteObject::class, ConcreteBuilder)
builderMap.put(BetonObject::class, BetonBuilder)
// builderMap.put(BetonObject::class, ConcreteBuilder) – will not compile

val builder = builderMap[T::class]

推荐阅读