kotlin - Kotlin:按类生成工厂
问题描述
我们正在尝试在 kotlin 中进行一些通用处理。基本上,对于给定的类,我们想要获取相关的 Builder 对象。ia 对于任何扩展 GenericObject 的对象,我们都需要该对象的 Builder。
interface Builder<T : GenericObject>
object ConcreteBuilder: Builder<ConcreteObject>
我们需要一个ConcreteBuilder
从ConcreteObject
我们当前的实现是一个 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]
推荐阅读
- android - 带有 clickable = "false" 的 ImageButton 仍然可以点击
- embedded-linux - 如何使用STM32MP1为嵌入式Linux项目实现自定义外设驱动?
- usps - 用于地址更正响应问题的 USPS API
- go - 如何修复解析 go.mod 模块将其路径声明为“x”但需要为“y”
- c# - 如何使用 System.Globalization 获取当前本地用户?
- java - 在 Eclipse 中使用 JEP/Pydev 看不到 print 和 println 语句
- python - 使用附加属性和方法扩展 python 内置类型的问题
- f# - F# 在没有第一个或最后一个元素的情况下优雅地折叠?
- swift - SwiftUI 列表动画
- algorithm - 从每个起始节点到每个结束节点,计算最短距离。节点到节点的距离为 1