为什么 Kotlin 不允许主构造函数中有任何代码?

Why Kotlin do not allow any code in primary constructor?

使用代码错误时会造成不便

abstract class View {
    abstract fun findViewById(id: Int): View
    abstract fun setOnClickListener(listener: (View) -> Boolean)
}

class ViewHolder(itemView: View) {
    init {
        child1.setOnClickListener { false }
    }
    val child1 = itemView.findViewById(1)
    val child2 = itemView.findViewById(2)
}

编译器抱怨:

Kotlin: Variable 'child1' must be initialized

所以我不得不添加一个额外的函数,每次构建后调用它:

class ViewHolder(itemView: View) {
    val child1 = itemView.findViewById(1)
    val child2 = itemView.findViewById(2)

    fun bindEventHandlers() {
        child1.setOnClickListener { false }
    }
}

val vh = ViewHolder(v)
vh.bindEventHandlers()

那么,有没有什么方便的方法来做这样的初始化事情呢?使用 Android RecyclerView 和 ListView 时经常会发生这种情况。

init 块之前定义属性 -

class ViewHolder(itemView: View) {
    val child1 = itemView.findViewById(1)
    val child2 = itemView.findViewById(2)

    init {
        child1.setOnClickListener { false }
    }
}