Kotlin 顶级函数与对象函数

Vah*_*han 9 android function kotlin

我有静态函数,它仅限于某些上下文,例如仅用于文档。有两种替代方法可以将其定义为顶级函数或对象中的函数。

1.

package com.armsoft.mtrade.data.pref

import com.armsoft.mtrade.App
import com.armsoft.mtrade.domain.model.DocSaveType

object DocPrefManager {
    private const val DOC_PREF = "DOC_PREF"

    private const val KEY_ORDER_SAVE_TYPE = "KEY_ORDER_SAVE_TYPE"

    @JvmStatic
    fun setOrderSaveType(orderSaveType: DocSaveType) {
        val context = App.getContext()
        val sharedPreferences = context.getSharedPreferences(DOC_PREF, 0)
        val editor = sharedPreferences.edit()
        editor.putString(KEY_ORDER_SAVE_TYPE, orderSaveType.getCode())
        editor.commit()
    }
}
Run Code Online (Sandbox Code Playgroud)

2.

package com.armsoft.mtrade.data.pref

import com.armsoft.mtrade.App
import com.armsoft.mtrade.domain.model.DocSaveType

fun setOrderSaveType(orderSaveType: DocSaveType) {
    val context = App.getContext()
    val sharedPreferences = context.getSharedPreferences(DocPrefManager.DOC_PREF, 0)
    val editor = sharedPreferences.edit()
    editor.putString(DocPrefManager.KEY_ORDER_SAVE_TYPE, orderSaveType.getCode())
    editor.commit()
}
Run Code Online (Sandbox Code Playgroud)

顶层函数的优点是不包含在对象中,缺点是可以从任何地方访问而无需类名前缀。对于这种情况,是否有优点或缺点或最佳实践?

Ale*_*nov 12

推荐的做法是永远不要使用 object 来创建命名空间,并在可能的情况下始终使用顶级声明。我们没有发现名称冲突是一个问题,如果确实发生冲突,您可以使用带别名的导入来解决它。

  • 对于那些在 2023 年阅读此已接受答案的人,Kotlin 文档中不再正式推荐顶级声明。另请阅读此 https://discuss.kotlinlang.org/t/best-practices-for-top-level-declarations/2198/8 和此 https://discuss.kotlinlang.org/t/extension-vs-member-功能/10769/7 (3认同)

Ray*_*ath 5

KotlinConf 2017 - 你可以,但你应该吗?Mike Gouline建议我们应该谨慎使用顶级函数,因为它可能会导致“自动完成污染”。

但是,顺便说一句,Andrey Breslav(截至本编辑, Kotlin 团队的团队负责人)将顶级功能视为他在 KotlinConf 2018 - Closing Panel 中最喜欢的语言功能。


小智 5

多模块项目提示:

使用internal可见性修饰符将顶级函数的范围限定为其包含的模块,这样它就不会污染无关模块中的 IDE 自动完成功能。

// module A
internal fun doSomething() {
    // ...
}

// module B
doSomething() // (!) Cannot access 'doSomething': it is internal in module A
              // Does NOT show up in module B's auto-complete
Run Code Online (Sandbox Code Playgroud)