有没有办法在数据类构造时转换属性的值?

Lau*_*ves 8 kotlin data-class

在创建数据类时,我经常发现我想要转换其中一个属性,通常是将其标准化或制作防御性副本.例如,在这里我想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生成的方法也不是真的好多了.

有没有办法转换数据类中的构造函数参数?

nha*_*man 8

不可以.对于相等和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方法.

如果你想获得"哈克",你可以假装你还在调用构造函数,通过重命名createinvoke并使它的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