Kotlin 私有扩展的用途是什么
我遇到了以下代码:Kotlin 私有扩展的用途是什么,kotlin,Kotlin,我遇到了以下代码: class BindableTextInputEditText : TextInputEditText { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?
class BindableTextInputEditText : TextInputEditText {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
fun bind() {
setTextAndCursor(text)
}
private fun TextInputEditText.setTextAndCursor(text: String?) {
}
}
我不清楚为什么setTextAndCursor是一个扩展。如果它是私有的,它就不能像大多数扩展那样真正通用。那么为什么要将它作为一个扩展而不仅仅是一个普通函数呢?在您的特定情况下,扩展是在一个扩展receiver类的类(TextInputItemText
)中声明的,因此声明一个常规方法的工作方式与扩展相同,或者至少产生相同的调用语法。所以我想说,在这里使用扩展是毫无意义的(有些人可能会在这里提到静态方法的性能..我不会走这条路)
尽管如此,我们通常不能拒绝私有扩展。扩展的要点不仅仅是一般用法,而是一种使用object.method()
语法以更自然的方式表达静态助手的方法
这使得程序员可以调用类似的内置方法和扩展方法,这两种方法的可读性都很好。它在私有上下文中也非常有用,因为它的主要目标是良好的语法
如果
setTextAndCursor
是您希望在textinputtext
上使用的方法,但它只在您的私有上下文中有用,那么将其声明为私有扩展是有意义的(除非您已经在该类的子类中,这是您的奇怪场景).将其声明为扩展允许在任何文本输入文本
上调用它,而不仅仅是在此
(或BindableTextInputitext
的其他实例)上调用它。你可以有这样的方法
fun bindOther(textField: TextInputEditText, text: String?) {
textField.setTextAndCursor(text)
}
也许这样的用法在以前的类中已经被删除了 不知道你说的“好语法”是什么意思。我个人看不出它有什么“好”的地方。我所说的“好语法”是调用myObj.doSomething()
,而不是静态等价物:doSomething(myObj)
。根据方法的语义,就风格而言,前者可能更可取。此外,如果选择将方法调用与其他调用链接起来,可能会更美观。