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

Posted

技术标签:

【中文标题】访问同一文件中类的私有成员的函数【英文标题】:Function accessing private member of a class in same file 【发布时间】:2021-10-31 08:55:13 【问题描述】:

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

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 中是不可能的。

我还有其他方法可以做到吗?

【问题讨论】:

【参考方案1】:

本质上你不希望这个属性对对象是私有的,因为你想在另一个函数中使用它。所以你应该声明它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)

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

【讨论】:

以上是关于访问同一文件中类的私有成员的函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

让公共成员变量访问 C++ 中同一类的私有成员

python中类成员修饰符

Java中类的继承与权限控制

C++中类和结构体的区别

java中类继承,到底继承了什么?