我想初始化val
属性,但属性初始化程序很复杂(包含几行代码):
private val properties: Properties = {
val properties = Properties()
val stream = Application::class.java.getResourceAsStream("application.properties")
properties.load(stream)
properties
}.invoke()
是否可以在不使用lambda的情况下重写此属性初始值设定项?
答案 0 :(得分:7)
如果您创建的事物的实例可以在开始时分配,然后您想要修改它,则可以使用apply
。如果您有一件事,请使用let()
,但要将其转换为另一件事。当你什么都没有开始时,你可以使用run()
,并建立一些东西来回归。
使用应用:
private val properties = Properties().apply {
load(Application::class.java.getResourceAsStream("application.properties"))
}
或使用让 :(不是最好的例子,但你明白了)
private val properties = Application::class.java.getResourceAsStream("application.properties")
.let { stream ->
val props = Properties()
props.load(stream)
props
}
或使用运行:
private val properties = run {
val properties = Properties()
val stream = Application::class.java.getResourceAsStream("application.properties")
properties.load(stream)
properties
}
有些库会创建这些变体,并将它们称为verifiedBy
或initializedBy
之类的东西,它们基本上会做同样的事情,但要明确意图。创建新函数,以便您的代码以您想要的方式读取,但也可以通过尝试使用stdlib函数来平衡它,因为这与其他Kotlin用户一致。