Kotlin同文件顶层函数如何访问object类的private成员且不改为internal?
解决方案
方案1:直接使用顶层私有属性(最推荐)
Kotlin 中顶层private成员的可见域就是当前源文件,刚好符合你的需求,同时顶层val属性和object内部属性的初始化时机一致,都是类加载阶段完成初始化,不需要担心初始化时机问题:
// 仅当前文件可见的顶层私有属性,类加载时初始化 private val myPrivateProperty = someInitializingStuff() // 顶层函数,直接调用即可用 foo(bar) 语法 fun foo(bar: String) { doSomethingWith(bar, myPrivateProperty) }
这个方案完全满足你的所有要求:属性仅当前文件可见、类加载时初始化、函数调用无类前缀。
方案2:将整个object声明为私有
如果你需要将相关逻辑封装在object内、不想直接暴露顶层属性,可以把整个MyObj声明为文件私有,这样外部文件完全无法访问这个object,自然也碰不到内部的属性:
// 整个object仅当前文件可见 private object MyObj { val myPrivateProperty = someInitializingStuff() } fun foo(bar: String) { doSomethingWith(bar, MyObj.myPrivateProperty) }
原修改不生效的原因
Kotlin 中类/object内部的private修饰符作用域仅为类/object内部,哪怕是同文件的其他顶层成员也没有访问权限,和C++的文件作用域规则不同。如果你需要文件级别的可见性控制,要通过给顶层成员或者整个类/object加private修饰符实现。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

