Kotlin中复用接口继承数据类映射代码的优雅方案问询
Kotlin中复用映射逻辑实现UserA到UserB的优雅转换
方案1:通过扩展函数复用已有映射
首先给UserA添加转换到UserB的扩展函数,直接复用UserA的所有BaseUser属性:
// 扩展UserA,转换为UserB,接收额外字段的计算值 fun UserA.toUserB(someComputedProperty: Int): UserB { return UserB( firstName = this.firstName, lastName = this.lastName, someComputedProperty = someComputedProperty ) }
接着,在UserEntity的扩展方法中复用已有的toDto()方法,再调用上面的转换函数:
// UserEntity转UserB,复用toDto()的逻辑 fun UserEntity.toUserB(): UserB { // 先转成UserA,复用已有映射逻辑 val userA = this.toDto() // 根据UserEntity的属性计算额外字段(示例逻辑) val computedValue = this.someEntityField * 3 return userA.toUserB(computedValue) }
这种方式的核心优势是:当BaseUser新增属性时,只需要修改UserA的构造和toDto()方法,UserB的转换会自动继承这些变更,完全避免重复编写大量属性映射代码。
方案2:灵活注入计算逻辑(可选)
如果不同场景下someComputedProperty的计算逻辑不同,可以把计算逻辑作为参数传入,提升灵活性:
// 支持传入自定义计算逻辑的扩展方法 fun UserEntity.toUserB(calculateExtra: (UserEntity) -> Int): UserB { return this.toDto().toUserB(calculateExtra(this)) } // 使用示例: val userB1 = userEntity.toUserB { it.age + it.score } val userB2 = userEntity.toUserB { it.id.hashCode() }
补充说明
由于UserA和UserB都实现了BaseUser接口,它们共享的属性都在接口中定义,通过UserA中转的方式能最大化复用已有映射逻辑。后续如果BaseUser接口扩展属性,只需要在UserA的toDto()中添加对应映射,UserB的转换无需额外修改,大大降低维护成本。
内容的提问来源于stack exchange,提问作者Denis Stephanov
相关产品推荐
相关产品推荐

