提问人:NullPointerException 提问时间:9/15/2023 更新时间:9/15/2023 访问量:41
在 kotlin 对象(单例)中访问 var 时出现问题
Problems accessing var in kotlin object (singleton)
问:
有这个对象:
object BarManager {
private var bars = mutableMapOf<String, Bar>()
}
无法像这样访问:bars
BarManager.bars[name]
它给了我这个错误:
无法访问“bars”:它在“BarManager”中是私有的
据推测,根据 Kotlin 属性和字段文档,每个可变(即 var)属性都会为其自动创建一个 getter 和 setter。因此,没有理由为 Kotlin 代码自动生成 getter 和 setter。
所以。。。这是怎么回事?
答:
2赞
Tenfour04
9/15/2023
#1
放置在属性前面的可见性是这些生成的访问器的可见性,而不是支持字段的可见性。支持字段始终是私有的(只有在使用 K2 编译器时才能直接在外部访问器使用;在 Kotlin 2.0 中将是官方的)。例外情况是当您使用 标记属性时,但这不会改变 Kotlin 代码中属性的处理方式,只会改变从 Java 代码中编译和查看属性的方式。@JvmInline
因此,当您放置 时,这意味着 getter 和 setter 都是私有的。删除关键字以使 getter 和 setter 公开(默认可见性)。private var
private
评论
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
}
评论
private var
public var
private
private
public