正在收集映射接口中的值

  • 本文关键字:接口 映射 java kotlin
  • 更新时间 :
  • 英文 :


我有一个接口,它存储已启用或未启用功能的标志,并具有返回此映射中属性的当前值的功能:

interface IModuleEnabler {
val module_1_parameter_1: Boolean
val module_1_parameter_2: Boolean
val module_1_parameter_3: Boolean
val module_2_parameter_1: Boolean
val module_2_parameter_2: Boolean
val module_2_parameter_3: Boolean

fun getPropertiesMap(): Map<String, List<Pair<String, Boolean>>> {
var propertiesMap: Map<String, List<Pair<String, Boolean>>> = mutableMapOf()
var properties = listOf<Pair<String, Boolean>>(
Pair<String, Boolean>("module_1_parameter_1", module_1_parameter_1),
Pair<String, Boolean>("module_1_parameter_2", module_1_parameter_2),
Pair<String, Boolean>("module_1_parameter_3", module_1_parameter_3)
)
propertiesMap = propertiesMap.plus("Module1" to properties)

return propertiesMap
}
}

这个接口有一个默认类,它正在实现它,如果需要,还有一个基于默认值的自定义类来覆盖默认值。然而,问题是函数getPropertiesMap((始终具有默认值,而不是被覆盖的值。是否有办法强制更新此函数以获得实际值?链接到游乐场-Kotlin游乐场

这是因为CustomFeatureEnablergetPropertiesMap委托给DefaultFeatureEnabler。您可以通过在使用委派的类中重写getPropertiesMap来修复它

class CustomFeatureEnabler : IModuleEnabler by DefaultFeatureEnabler() {
override val module_1_parameter_3: Boolean get() = true

override val module_2_parameter_1: Boolean get() = true
override fun getPropertiesMap() = super.getPropertiesMap() // <---
}

https://kotlinlang.org/docs/delegation.html#overriding-a-接口成员-通过授权实现

这是Kotlin中委托的一个缺点。委托中的函数不知道将其用作委托的类,并且它将忽略该类中的重写函数。

最好将getPropertiesMap函数实现为扩展函数,这样它就不会被重写。这会解决你的问题,但无论如何还是最好练习一下。当你在界面中定义它时,它被保留为open,实际上会邀请用户覆盖它。此外,你正在使用一种复杂的方式来创建地图。

fun IModuleEnabler.getPropertiesMap(): Map<String, List<Pair<String, Boolean>>> {
val properties = listOf(
Pair("module_1_parameter_1", module_1_parameter_1),
Pair("module_1_parameter_2", module_1_parameter_2),
Pair("module_1_parameter_3", module_1_parameter_3)
)
return mapOf("Module1" to properties)
}

无论如何,我会在没有压倒一切和授权的情况下这样做。允许Default实现设置构造函数中的值。自定义实现可以简单地用它想要的不同值调用超级构造函数。

open class DefaultFeatureEnabler(
override val module_1_parameter_1: Boolean = false,
override val module_1_parameter_2: Boolean = false,
override val module_1_parameter_3: Boolean = false,
override val module_2_parameter_1: Boolean = false,
override val module_2_parameter_2: Boolean = false,
override val module_2_parameter_3: Boolean = false
): IModuleEnabler
class CustomFeatureEnabler: DefaultFeatureEnabler(
module_1_parameter_3 = true,
module_2_parameter_1 = true
)

最新更新