如何用单个数据类返回多种Lookup实体类实例?
通用LookupResult实现方案
直接用Kotlin泛型就能实现一次编写、复用所有实体类的需求,完全避免重复代码,比用Any类型更安全(编译期就能检查类型,不会出现运行时类型转换错误)。
1. 定义泛型数据类
创建一个带泛型参数的LookupResult数据类,泛型参数用来指定resultClass的类型:
data class LookupResult<T>( val wasSuccessful: Boolean = false, val resultClass: T? = null )
2. 使用示例
针对不同的实体类,直接指定泛型参数即可,无需重复定义新的数据类:
// 返回AssetStatus类型的结果 fun getAssetStatus(id: Long): LookupResult<AssetStatus> { // 模拟数据库查询逻辑 val status = AssetStatus(id, "Active") return LookupResult(wasSuccessful = true, resultClass = status) } // 返回StockItemStatus类型的结果 fun getStockItemStatus(id: Long): LookupResult<StockItemStatus> { val status = StockItemStatus(id, "InStock") return LookupResult(wasSuccessful = true, resultClass = status) } // 返回NominalCode类型的结果 fun getNominalCode(id: Long): LookupResult<NominalCode> { val code = NominalCode(id, "CODE-001") return LookupResult(wasSuccessful = true, resultClass = code) }
3. 可选:添加类型约束(如果需要)
如果所有实体类有共同的父类或接口(比如都继承自BaseLookupEntity),可以给泛型参数加上约束,确保只能传入指定类型的实体:
// 先定义基础父类或接口 open class BaseLookupEntity( val id: Long?, val name: String ) // 让所有实体继承该父类 data class AssetStatus( @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "asset_status_id") override val id: Long? = null, @Column(name = "asset_status_name") override val name: String = "" ) : BaseLookupEntity(id, name) // 然后给LookupResult添加类型约束 data class LookupResult<T : BaseLookupEntity>( val wasSuccessful: Boolean = false, val resultClass: T? = null )
这样做的好处是:
- 保证
LookupResult只能接收指定类型的实体,避免误用 - 可以在
LookupResult中安全调用父类的公共方法/属性
内容的提问来源于stack exchange,提问作者JamieRhys
相关产品推荐
相关产品推荐

