我想在Kotlin中实现以下设计:
类层次结构的大小,共享一个公共根(我们称它为Base
)。此层次结构的所有类都有一些参数,应该可以静态(因为在工厂方法中需要它们)和动态(因为从外部代码中需要它们)都可以访问这些参数。另外,由于我将创建这些类的很多实例,因此我想避免实例化每个实例的属性列表/集合。
这是我能够组合在一起的,虽然可以,但是感觉很丑。
abstract class Base {
open val params: List<Int> get() = Companion.params
companion object : BaseCompanion()
}
abstract class BaseCompanion {
open val params: List<Int> = emptyList<Int>()
}
class A: Base() {
override val params: List<Int> get() = Companion.params
companion object : BaseCompanion() {
override val params: List<Int> = listOf(1, 3)
}
}
感觉很笨拙的部分是,每个从Base
继承的类都必须:
是否有更好,更实用的Kotlin方法?
反之亦然,例如,从外部传递列表,例如:
abstract class Base(val params : List<Int>)
class A(params : List<Int>) : Base(params)
在对象创建方面,只需保留该“静态”列表并将其传递给新创建的对象:
val staticParams = listOf(1, 3)
val oneOfManyA = A(staticParams)
[如果您仍然希望单独实例化A
而无需传递静态参数和/或通过将其保留在同伴中的外观,您仍然可以通过使用invoke
-运算符来做到这一点:
class A(params : List<Int>) : Base(params) {
companion object {
private val staticParams = listOf(1, 3)
operator fun invoke() = A(staticParams)
}
}
现在您可以按如下方式调用它,它将使用伴随对象中的静态参数实例化:
A()