为什么 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 }
}
}
使用代码错误时会造成不便
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 }
}
}