有没有办法在特定的构造函数中延迟初始化一个昂贵的字段?
Is there a way to lazy-init a costly field in a specific constructor?
我有一个数据class我想填充,在一个构造函数中我已经有了数据,而在另一个构造函数中我想只在需要时获取它,这很少见。
示例代码为:
data class Source1(val str1: String)
data class Source2(val str2: String)
data class DTO(val data1: String, val data2: String) {
// ctor which does not need laziness
constructor(source1: Source1) : this(
data1 = source1.str1,
data2 = source1.str1
)
// ctor which needs costly data
constructor(source2: Source2, costlyData: String) : this(
data1 = source2.str2,
data2 = costlyData
)
}
fun demo() {
val source1 = Source1("some str - 1")
DTO(source1)
val source2 = Source2("some str - 2")
val costlyData: String = costlyOperation() // this is the operation I'd like to execute lazily
DTO(source2, costlyData)
}
我想说最简单的方法是接受一个函数作为构造函数参数,像这样:
class DTO(provider:()->String){
constructor(data: String):this({data})
val data by lazy{ provider()}
}
因此您可以两种方式使用它:
val eager = DTO("some str - 1")
val lazy = DTO(::costlyOperation)
更好的方法是使用不同实现的 Source
抽象来提供常量值和执行操作。但总体思路是一样的。
尽管我不会再调用此 DTO 并且它失去了有关内容的数据 class 功能。
我有一个数据class我想填充,在一个构造函数中我已经有了数据,而在另一个构造函数中我想只在需要时获取它,这很少见。
示例代码为:
data class Source1(val str1: String)
data class Source2(val str2: String)
data class DTO(val data1: String, val data2: String) {
// ctor which does not need laziness
constructor(source1: Source1) : this(
data1 = source1.str1,
data2 = source1.str1
)
// ctor which needs costly data
constructor(source2: Source2, costlyData: String) : this(
data1 = source2.str2,
data2 = costlyData
)
}
fun demo() {
val source1 = Source1("some str - 1")
DTO(source1)
val source2 = Source2("some str - 2")
val costlyData: String = costlyOperation() // this is the operation I'd like to execute lazily
DTO(source2, costlyData)
}
我想说最简单的方法是接受一个函数作为构造函数参数,像这样:
class DTO(provider:()->String){
constructor(data: String):this({data})
val data by lazy{ provider()}
}
因此您可以两种方式使用它:
val eager = DTO("some str - 1")
val lazy = DTO(::costlyOperation)
更好的方法是使用不同实现的 Source
抽象来提供常量值和执行操作。但总体思路是一样的。
尽管我不会再调用此 DTO 并且它失去了有关内容的数据 class 功能。