函数访问同一文件中 class 的私有成员
Function accessing private member of a class in same file
我有一个函数依赖于在 class 加载时初始化的 属性。目前是这样写的:
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
,因为这样我的同事就可以从他们自己的 classes 访问它,但我希望它只能被这个源文件中声明的函数访问。
如果我用 C++ 编写此代码,我会在函数体内将 myPrivateProperty
定义为静态局部变量,但这在 Kotlin 中是不可能的。
还有其他方法吗?
本质上你不希望这个 属性 对对象是私有的,因为你想在另一个函数中使用它。所以你应该声明它 private
但在文件级别(顶级)而不是。如果不需要,则不必将此变量存储在对象中:
private val myPrivateProperty = someInitializingStuff();
fun foo(bar: String) {
doSomethingWith(bar, myPrivateProperty)
}
另一种选择是使对象本身对文件私有,但对象中的 属性 可以是 public:
private object MyObj {
val myPrivateProperty = someInitializingStuff();
}
fun foo(bar: String) {
doSomethingWith(bar, MyObj.myPrivateProperty)
}
但是,我会觉得这很奇怪,因为在这里使用对象似乎并不合理。如果是(例如因为你想公开它的其他属性 publicly),那么我想你应该把那个私有变量放在对象之外,如第一个选项所示。
我有一个函数依赖于在 class 加载时初始化的 属性。目前是这样写的:
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
,因为这样我的同事就可以从他们自己的 classes 访问它,但我希望它只能被这个源文件中声明的函数访问。
如果我用 C++ 编写此代码,我会在函数体内将 myPrivateProperty
定义为静态局部变量,但这在 Kotlin 中是不可能的。
还有其他方法吗?
本质上你不希望这个 属性 对对象是私有的,因为你想在另一个函数中使用它。所以你应该声明它 private
但在文件级别(顶级)而不是。如果不需要,则不必将此变量存储在对象中:
private val myPrivateProperty = someInitializingStuff();
fun foo(bar: String) {
doSomethingWith(bar, myPrivateProperty)
}
另一种选择是使对象本身对文件私有,但对象中的 属性 可以是 public:
private object MyObj {
val myPrivateProperty = someInitializingStuff();
}
fun foo(bar: String) {
doSomethingWith(bar, MyObj.myPrivateProperty)
}
但是,我会觉得这很奇怪,因为在这里使用对象似乎并不合理。如果是(例如因为你想公开它的其他属性 publicly),那么我想你应该把那个私有变量放在对象之外,如第一个选项所示。