我创建了一个映射硬映射值到false
但是当我想访问它时,我得到了一个可为空的布尔值。除了我在下面的建议之外,我如何避免它?
object Keyboard{
val keys = Key.values().associate { it to false }.toMutableMap()
fun pressButtonForEvent(event : KeyEvent){
keys[event.key] = true
}
fun isPressed(key : Key) : Boolean {
return keys[key]
}
}
建议解决它(但我不喜欢它(
fun isPressed(key : Key) : Boolean {
return if (keys.containsKey(key)){
keys[key]!!
} else false
}
如果您不确定其他人是否可以将键放入您的映射中,请使用getOrElse
或getOrDefault
来访问这些值:
keys.getOrElse(key) { false }
keys.getOrDefault(key, false)
或者使用withDefault
-wrapper: 初始化您的地图,例如:
keys = mutableMapOf<Key, Boolean>().withDefault { false } // in the end you initialize every key with false
然后可以通过getValue
访问该值:
keys.getValue(key)
如果您在没有withDefault
的情况下使用getValue
,则如果给定键没有值,您将收到异常。在适当的withDefault
设置下使用它,如果地图中没有这样的键,它将始终为您提供默认值。
最后但并非最不重要的一点是:如果你完全控制了那张地图,没有人会把其他任何东西放进去,那么keys[key]!!
也可能没问题......在所有其他情况下,keys.getValue(key)
可能更好,因为异常消息清楚地说明了缺少哪个键,而使用!!
,您只会得到一个NullPointerException
。