在 kotlin 对象(单例)中访问 var 时出现问题

Problems accessing var in kotlin object (singleton)

提问人:NullPointerException 提问时间:9/15/2023 更新时间:9/15/2023 访问量:41

问:

有这个对象:

object BarManager {
    private var bars = mutableMapOf<String, Bar>()
}

无法像这样访问:bars

BarManager.bars[name]

它给了我这个错误:

无法访问“bars”:它在“BarManager”中是私有的

据推测,根据 Kotlin 属性和字段文档,每个可变(即 var)属性都会为其自动创建一个 getter 和 setter。因此,没有理由为 Kotlin 代码自动生成 getter 和 setter。

所以。。。这是怎么回事?

Android Kotlin 对象 单例 var

评论

0赞 Pawel 9/15/2023
生成的访问器方法的可见性由属性本身定义,在您的例子中,属性是私有的。编译器将生成一个私有支持字段,您不必自己声明它。
0赞 broot 9/15/2023
属性更像是方法(getter/setter),而不是字段。如果这样做,则意味着需要专用访问器。 完全符合您的需求 - 公共访问器和私有支持字段。private varpublic var
2赞 Louis Wasserman 9/15/2023
你认为这意味着什么?private
0赞 marcpetitvecino 9/15/2023
只需删除关键字,就像 Kotlin 中的默认可见性修饰符一样。privatepublic
0赞 NullPointerException 9/15/2023
“您放在属性前面的可见性是这些生成的访问器的可见性,而不是支持字段的可见性。支持字段始终是私有的“这正是我一直在寻找的。我不知道。谢谢你们的帮助。

答:

2赞 Tenfour04 9/15/2023 #1

放置在属性前面的可见性是这些生成的访问器的可见性,而不是支持字段的可见性。支持字段始终是私有的(只有在使用 K2 编译器时才能直接在外部访问器使用;在 Kotlin 2.0 中将是官方的)。例外情况是当您使用 标记属性时,但这不会改变 Kotlin 代码中属性的处理方式,只会改变从 Java 代码中编译和查看属性的方式。@JvmInline

因此,当您放置 时,这意味着 getter 和 setter 都是私有的。删除关键字以使 getter 和 setter 公开(默认可见性)。private varprivate

评论

0赞 NullPointerException 9/15/2023
“您放在属性前面的可见性是这些生成的访问器的可见性,而不是支持字段的可见性。支持字段始终是私有的“这正是我一直在寻找的。谢谢。
1赞 PatchesDK 9/15/2023 #2

您已将 visibilty 设置为 private,因此无法在 BarManager 对象之外访问它。bars

只需删除修饰符即可。private

object BarManager {
     var bars = mutableMapOf<String, Bar>()
}

您可能也可以将该属性声明为 a,因为它似乎不需要可变性。val

object BarManager {
     val bars = mutableMapOf<String, Bar>()
}

如果由于某种原因,它需要成为 BarManager 中的可变引用,但您不希望它从 BarManager 外部更改引用,则可以执行此操作

object BarManager {
     val bars = mutableMapOf<String, Bar>()
     private set
}