我们目前正在将项目切换到Kotlin,并遇到以下问题:
我们仅在给定的类内需要某个扩展功能。因此,我们有两种可能性:(1)在文件顶层声明扩展函数private
或(2)在类内部声明扩展函数private
。
跟随MCVE:
顶级示例(文件C1.kt
):
private fun String.double() = this.repeat(2)
class C1 {
init {
println("init".double())
}
}
内部类示例(文件C2.kt
):
class C2 {
private fun String.double() = this.repeat(2)
init {
println("init".double())
}
}
问题:
这两种方法是否有区别,除了在C1.kt
中扩展功能String.double()
对于其他可能的文件成员(例如同一文件中的其他类)也可见?
由于我们想“尽可能多地获得代码”,所以我们想知道两种方法中的哪一种是建议的。上面的示例是否有官方建议/风格指南?我认为声明扩展函数尽可能接近其预期用途被认为是一种好习惯,因此在上面的示例中,将建议使用C2
的结构?
答案 0 :(得分:3)
- 除了在
li>C1.kt
中扩展功能String.double()
对其他可能的文件成员(例如同一文件中的其他类)也可见之外,这两种方法是否有区别?
有一个区别:在类中指定扩展函数时(在您的示例中为C2
),那么您还可以使用qualified this
语法访问该类的实例(在您的示例中) this@C2
。
- 由于我们希望“尽可能多地实现代码”,所以我们想知道两种方法中的哪一种是建议的。上面的示例是否有官方建议/风格指南?我认为声明扩展函数尽可能接近其预期用途被认为是一种好习惯,因此在上面的示例中将建议使用
C2
的结构?
这是一个好问题。就个人而言,我会将扩展功能放在类之外,因为扩展功能(通常)会指定与 extended 类型相关的行为,而不是与使用它们的类类型有关的行为。但是,如果 do 在扩展函数中需要与类有关的信息,则可以在类中指定它们。