ume*_*esh 1 yaml kotlin kotlin-extension
我是科特林的新手。我正在 kotlin 程序中从属性文件中读取键和值。但是我不知道如何直接返回一个键的值。请在下面找到 application.yml 和 abc.class(这是一个 kotlin 类)。
应用程序.yml
abcconfig:
isabcEnabled:
default: false
xyz: true
def: true
Run Code Online (Sandbox Code Playgroud)
abc.class
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component
@Component
@ConfigurationProperties(prefix = "abcconfig")
class AbcConfig {
private var abcEnabled: Map<String, Boolean> = mutableMapOf()
fun getabcEnabledValue(siteId: String?): Boolean {
val abc: Boolean
val key: String? = if (abcEnabled.containsKey(key)) key else "default"
abc = abcEnabled[key]
return abc
}
fun setAbcEnabled(abcEnabled: Map<String, Boolean>) {
this.abcEnabled = abcEnabled
}
}
Run Code Online (Sandbox Code Playgroud)
这是关于可空性的。Kotlin 编译器会跟踪每个值是否可以为 null,并防止您做不安全的事情。
此问题中的代码有一个特殊的可空性问题。(它也有一些混乱,包括key在它设置之前的两个引用。我假设那些应该是siteId。)
问题是当地abcEnabled图不包含请求的密钥时会发生什么。如果键存在,则[…]操作符将返回相应的Boolean值;但如果键不存在(如果映射不包含“默认”键,则可能发生这种情况),则返回 null。但是,您尝试将其分配给的变量的类型为Boolean,不允许为空值。这就是编译器抱怨的原因。
因此,如果地图不包含“默认”键,您必须决定要发生什么。(或者找到一种方法来确保它总是如此;但这要困难得多,特别是如果可以在对象完全初始化之前调用该方法,或者在另一个线程正在设置或更新映射时调用。因此处理这种情况要安全得多优雅。)
如果你想false在这种情况下返回,代码可以归结为:
fun getabcEnabledValue(siteId: String?): Boolean {
val key: String? = if (abcEnabled.containsKey(siteId)) siteId else "default"
return abcEnabled[key] ?: false
}
Run Code Online (Sandbox Code Playgroud)
甚至(为了更好的线程安全以及简洁和清晰):
fun getabcEnabledValue(siteId: String?)
= abcEnabled[siteId] ?: abcEnabled["default"] ?: false
Run Code Online (Sandbox Code Playgroud)
或者,如果您想null在这种情况下返回,只需将函数声明为返回Boolean?(允许为 null)——或者?: false在最后一个示例中省略 。
(另外,作为一个风格问题,我不确定你为什么要创建abcEnabled一个私有属性然后添加自己的 setter。是否真的有必要隐藏 getter?如果没有,公共属性会更简单。而且它是可能值得使abc方法名称中的大小写一致。)
| 归档时间: |
|
| 查看次数: |
8859 次 |
| 最近记录: |