在创建数据类时,我经常发现我想要转换其中一个属性,通常是将其标准化或制作防御性副本.例如,在这里我想productCode永远是小写的:
data class Product(val productCode: String)
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加一个init块,希望Kotlin足够聪明,让我手动处理构造函数参数赋值给属性:
data class Product(val productCode: String) {
init {
this.productCode = productCode.toLowerCase()
}
}
Run Code Online (Sandbox Code Playgroud)
但它将此视为重新分配.
我宁愿不用手写equals/ hashCode/ toString/ copyIDE生成的方法也不是真的好多了.
有没有办法转换数据类中的构造函数参数?
不可以.对于相等和toString工作,属性需要在主构造函数中.
但是,你可以做的是创建一个工厂方法:
data class Product private constructor(val productCode: String) {
companion object Factory {
fun create(productCode: String) : Product {
return Product(productCode.toLowerCase())
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过制作构造函数,private您可以强制使用此create方法.
如果你想获得"哈克",你可以假装你还在调用构造函数,通过重命名create来invoke并使它的operator功能:
data class Product private constructor(val productCode: String) {
companion object {
operator fun invoke(productCode: String): Product {
return Product(productCode.toLowerCase())
}
}
}
Run Code Online (Sandbox Code Playgroud)
调用Product("foo")将调用该invoke方法.
注意:构造函数仍然通过该copy方法公开,请参阅https://youtrack.jetbrains.com/issue/KT-11914
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |