我们目前正在将项目切换到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的结构吗?
  • 最佳答案



    有一个区别:在类中指定扩展函数时(在示例C2中),然后您还可以使用qualified this 语法(在示例this@C2中)访问此类的实例。



    这是个好问题。就个人而言,我会将扩展功能放在类之外,因为扩展功能(通常)会指定与扩展类型有关的行为,而不是与使用它们的类的类型有关的行为。但是,如果您确实需要扩展功能中与类相关的信息,则可以在类中指定它们。

    关于kotlin - 私有(private)顶级扩展功能与类内部的私有(private)扩展功能之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54782787/

    10-12 22:13
    查看更多