Kotlin:按类生成工厂

罗林托库尔

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

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>
    ...

但是,这不是很好:

  • 我们需要一个明确的演员表 Builder<T>
  • 该地图没有的概念T,键和值可能与不同的类型有关。

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

迈克尔·皮菲尔

地图的包装可以是:

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]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有通用输出的 Kotlin 工厂类

生成Kotlin类图

生成值后,Lazy类是否清除对工厂委托的引用?

如何编写一个类工厂来生成具有不同元类的类

将Kotlin与生成的Java类集成

在IntelliJ中为Kotlin类生成SerialVersionUID

抽象工厂与继承Kotlin

将包含静态工厂方法的 Java 类转换为 Kotlin 时出现问题

Kotlin-具有私有构造函数的类的工厂函数

Python工厂类继承

Tkinter的嵌套类工厂

Python的通用类工厂

模板类工厂

使用静态工厂类生成GUI组件-如何以及在何处添加所需的侦听器?

Kotlin密封类-如何按密封类排序类似于按枚举排序

我们如何键入一个类工厂,该工厂在给定对象常量的情况下生成一个类?

Kotlin生成列表的排列(按顺序),没有重复的元素

Java工厂设计模式或工厂类的说明

Kotlin过滤器成员属性(按当前注释类)

如何在 Kotlin 中按名称动态调用类

内存工厂类中的Angular JIT和AOT-它们是实际生成的还是仅在内存中生成的?

Kotlin插件错误:无法为类org.jetbrains.kotlin.gradle.tasks.KotlinCompile生成代理类

无法从Kotlin Jacoco测试覆盖范围中排除生成的类

Kotlin Android Apollo客户端未生成架构类

匕首2:在Intellij Idea(Kotlin)中找不到生成的类

Kotlin 在从泛型类生成实例时提供类型

Kotlin 数据类:如何为嵌入的文档生成 MongoDB ObjectId

QueryDSL:使用 Kotlin 和 Gradle 生成类失败

工厂模式在工厂类中实例化类