私有顶层扩展函数与类内私有扩展函数的区别

10
我们目前正在将项目转换为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的建议使用,如果扩展不需要访问其他私有成员,定义扩展外部可能是有意义的。 - Gerard Bosch
1个回答

9
  1. 除了在 C1.kt 中声明的扩展函数 String.double() 也会对可能存在的文件成员(例如同一文件中的其他类)生效之外,这两种方法有什么区别吗?

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接