访问同一文件中类的私有成员的函数



我有一个函数,它依赖于在类加载时初始化的属性。目前,它是这样写的:

object MyObj {
private val myPrivateProperty = someInitializingStuff();
fun foo(bar: String) {
doSomethingWith(bar, myPrivateProperty)
}
}

但是,我更喜欢使用更简单的语法foo(bar)而不是MyObj.foo(bar)来调用它。所以我想我可以把它从对象声明中去掉,像这样:

object MyObj {
private val myPrivateProperty = someInitializingStuff();
}
fun foo(bar: String) {
doSomethingWith(bar, MyObj.myPrivateProperty)
}

我希望foo仍然能够访问myPrivateProperty,因为它在同一个源文件中,但不幸的是它无法访问。我不想让它成为internal,因为这样我的同事就可以从他们自己的类访问它,但我希望这只能访问在这个源文件中声明的函数。

如果我用c++写这个,我会把myPrivateProperty定义为函数体内的静态局部变量,但这在Kotlin中是不可能的。

还有别的办法吗?

本质上你不希望这个属性是私有的对象,因为你想在另一个函数中使用它。所以你应该声明它为private,但是在文件级别(顶层)。如果不需要,则不必将此变量存储在对象中:

private val myPrivateProperty = someInitializingStuff();
fun foo(bar: String) {
doSomethingWith(bar, myPrivateProperty)
}

另一种选择是使对象本身对文件私有,但对象中的属性可以是公共的:

private object MyObj {
val myPrivateProperty = someInitializingStuff();
}
fun foo(bar: String) {
doSomethingWith(bar, MyObj.myPrivateProperty)
}

然而,我觉得这很奇怪,因为在这里使用对象似乎不合理。如果它是(例如,因为您想公开它的其他属性),那么我猜您应该将该私有变量放在对象之外,如第一个选项所示。

最新更新