Kotlin顶级函数与对象函数

时间:2019-02-25 09:21:01

标签: 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()
    }
}

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()
}

顶级函数的优点是它不包装在对象中,而缺点是可以在没有类名前缀的情况下从任何地方访问它。这种情况是否有优点或缺点或最佳做法?

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

  

多模块项目的提示:

     

使用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

答案 2 :(得分:0)

object Clazz将被编译为单例,顶级功能将在JVM中被编译为静态。

如果没有理由将您的方法用作实例,那么静态(顶级,伴随对象)方法将具有较高的性能。(参考:https://stackoverflow.com/a/11993118/5354658

答案 3 :(得分:0)

尽管建议的方法是在可能的情况下使用顶层声明,但是仅在特定上下文中使用的功能应该限制在该上下文中,并在相关中声明类。顶级功能对于定义 helper utility 功能特别有用。一个例子就是Java标准库中集合的功能,它们具有真正的全局作用域。常数也是如此。阅读此答案https://stackoverflow.com/a/48820895/1635488

下的讨论

在您的情况下,DocPrefManager具有特定的上下文。另外,我想您也不想使用特定功能来污染IDE自动完成列表。导致无法维护。

P.S。 DocPrefManager函数不应依赖App.getContext()。 DocPrefManager类应使用上下文进行初始化,在这种情况下,使用顶级函数是奇怪的,因为您的函数不是静态的。

答案 4 :(得分:0)

KotlinConf 2017 - You Can, but Should You? by Mike Gouline建议我们应谨慎使用顶级功能 ,因为它可能会导致“自动完成污染”。

但是,顺便说一句,顺便说一句,安德烈·布雷斯拉夫(Andrey Breslav)将顶级功能视为他在KotlinConf 2018-闭幕式中最喜欢的语言功能。