【问题标题】:Difference between private top-level extension function and private extension function inside class私有顶级扩展函数和类内部私有扩展函数的区别
【发布时间】:2019-07-13 22:23:42
【问题描述】:

我们目前正在将我们的项目切换到 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())
    }
}

问题:

  1. 这两种方法有什么不同,除了C1.kt 中的扩展函数String.double() 对其他可能的文件成员(例如同一文件中的其他类)也可见?

  2. 由于我们希望实现代码“尽可能 kotlinic”,因此我们想知道这两种方法中的哪一种是建议的方法。上面的示例是否有官方建议/样式指南?我认为将扩展函数声明为尽可能接近其预期用途被认为是一种好习惯,因此在上面的示例中建议使用C2 的结构?

【问题讨论】:

  • 只是好奇:如果你让 IntelliJ 为你创建扩展函数,它会被放在类之外。我找不到指南或建议,因此使用 IntelliJ 的建议,如果扩展不需要访问其他私有成员,那么在外部定义扩展可能是有意义的。

标签: kotlin extension-methods member toplevel extension-function


【解决方案1】:
  1. 除了C1.kt 中的扩展函数String.double() 对其他可能的文件成员(例如同一文件中的其他类)也可见之外,这两种方法有什么不同吗?

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

  1. 由于我们希望实现代码“尽可能 kotlinic”,因此我们想知道这两种方法中的哪一种是建议的方法。上面的示例是否有官方建议/样式指南?我认为将扩展函数声明为尽可能接近其预期用途被认为是一种好习惯,因此在上面的示例中建议使用 C2 的结构?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2017-12-21
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多