我具有静态功能,该功能仅限于某些上下文,例如仅适用于文档。有两种方法可以将其定义为顶级函数或对象中的函数。
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()
}
顶级函数的优点是它不包装在对象中,而缺点是可以在没有类名前缀的情况下从任何地方访问它。这种情况是否有优点或缺点或最佳做法?
答案 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-闭幕式中最喜欢的语言功能。