【问题标题】:What is the better way to transform one object to another in Kotlin?在 Kotlin 中将一个对象转换为另一个对象的更好方法是什么?
【发布时间】:2020-01-10 10:51:38
【问题描述】:

我的项目中有多个对象类,我需要将一个对象转换为另一个对象。

我尝试创建一个通用工具并开始转换它们,代码开始增长并且无法在单个文件中进行管理。

然后我开始创建类似于此的个人transformer 类,

/** This transforms [Square] to [Rectangle] **/
object SquareToRectangleTransformer {
   fun transform(square: Square): Rectangle {
       checkNotNull(square.side) { missing ("side") }
       val length = square.side
       val breadth = square.side
       return Rectangle(length, breadth
   }
}

现在我的项目有多个类似于上述的转换器类,现在我发现这种方法是一种反模式,因为它会产生类爆炸问题。

我搜索了其他替代方案,例如插件或依赖库,它们可以用更少的代码和源代码为我完成这项工作this answer interesting

Kotlin 中是否有任何类似的库可以为我完成这项工作?

【问题讨论】:

    标签: kotlin design-patterns object-object-mapping


    【解决方案1】:

    让 Rinat Suleimanov 回答我使用扩展程序所做的事情

    data class SquareResponse(val side: Int, name: String)
    
    data class SquareEntity(val side: Int, name: String)
    
    // transforms a single object
    fun SquareResponse.transform(): SquareEntity {
        this.apply {
            return SquareEntity(
                side, name
            )
        }
    }
    
    // transforming lists
    fun List<SquareResponse>.transform(): List<SquareEntity> {
        return this.map {
            it.transform()
        }
    }
    
    // Example use
    fun listTransform(squares: List<SquareResponse>): List<SquareEntity> {
        return squares.transform()
    }
     
    
    fun singleTranform(squar: SquareResponse): SquareEntity {
        return square.transform()
    }
    

    【讨论】:

      【解决方案2】:

      在我的项目中,我们也面临同样的问题,我们必须将一个对象转换为另一个对象。因此,我们采用了这种方法,我们添加了一个 from() 方法作为伴随对象。例如,如果我想将正方形转换为矩形,我就写Rectangle.from(square)

      class Rectangle(){
        companion object {
          fun from(square: Square): Reactangle{
             return Rectangle(square.side,square.side)
          }
        }
      }
      

      有了这个,我们可以将一个对象转换成其他对象,同时也让你的代码更干净。

      【讨论】:

        【解决方案3】:

        我建议您为要进行的每个转换创建一个扩展函数。对我来说,这是非常清晰和好的方式。几乎所有的 kotlin 标准库都以相同的方式编写。示例:

           fun Square.transform(): Rectangle {
               val length = square.side
               val breadth = square.side
               return Rectangle(length, breadth)
           }
        }
        

        您可以将此函数作为成员函数调用:

        val square = Square(4)
        val rectangle = square.transform()
        

        你也可以避免checkNotNull(square.side) { missing ("side") },如果你做了类型,表示侧不可为空:

        data class Square(
            val side: Int
        )
        

        【讨论】:

          猜你喜欢
          • 2017-10-15
          • 2017-01-31
          • 2021-11-18
          • 2021-08-14
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 1970-01-01
          • 2015-09-03
          相关资源
          最近更新 更多