Kotlin 在构造函数工作中调用非最终函数
在 Kotlin 中,它会在构造函数中调用抽象函数时向您发出警告,并引用以下有问题的代码:
abstract class Base {
var code = calculate()
abstract fun calculate(): Int
}
class Derived(private val x: Int) : Base() {
override fun calculate(): Int = x
}
fun main(args: Array<String>) {
val i = Derived(42).code // Expected: 42, actual: 0
println(i)
}
输出是有意义的,因为调用时,尚未初始化。calculate
x
这是我在编写java时从未考虑过的事情,因为我使用了这个模式而没有任何问题:
class Base {
private int area;
Base(Room room) {
area = extractArea(room);
}
abstract int extractArea(Room room);
}
class Derived_A extends Base {
Derived_A(Room room) {
super(room);
}
@Override
public int extractArea(Room room) {
// Extract area A from room
}
}
class Derived_B extends Base {
Derived_B(Room room) {
super(room);
}
@Override
public int extractArea(Room room) {
// Extract area B from room
}
}
这工作得很好,因为被覆盖的函数不依赖于任何未初始化的数据,但它们对于每个各自的派生都是唯一的(因此需要抽象)。这在 kotlin 中也有效,但它仍然发出警告。extractArea
class
那么,这在java/kotlin中是糟糕的做法吗?如果是这样,我该如何改进它?是否有可能在 kotlin 中实现,而不会被警告在构造函数中使用非最终函数?
一个潜在的解决方案是将行移动到每个派生的构造函数,但这似乎并不理想,因为它只是重复的代码,应该是超类的一部分。area = extractArea()