我有一个带有一些可为空属性的类
data class RequestModel(
val description: String?
)
和验证函数
fun validate(model: RequestModel): RequestModel{
if(model.description == null) throw IllegalArgumentException("description must be non null")
return model
}
在此验证步骤之后,我需要一种方法来指示 description
属性的不可空性。
一个解决方案是创建一个具有非 null 属性的新数据类 data class RequestModel(val description: String)
。
但我正在寻找一种通用方法来避免创建每个用例新类。
理想的通用解决方案:
fun validate(model: RequestModel): NoNullableField<RequestModel>
如何以通用方式从具有可为 null 属性的类的属性中删除可为 null 性?使用某种 kotlin 编译器合约有用吗?
最佳答案
您可以使用Kotlin reflection获取所有属性并检查它们是否不为空:
inline fun <reified T : Any> T.requireNoNullableProperties() = NoNullableProperties(this, T::class)
class NoNullableProperties<out T : Any>(val obj: T, clazz: KClass<T>) {
init {
clazz.memberProperties.forEach { prop ->
if (prop.returnType.isMarkedNullable) {
prop.isAccessible = true
requireNotNull(prop.get(obj)) {
"${prop.name} must be not null, obj - [$obj]"
}
}
}
}
operator fun <R> get(property: KProperty1<in T, R?>): R = requireNotNull(property.get(obj)) {
"Extension and mutable properties can't be validated, property - [$property], obj - [$obj]"
}
}
用例:
val validated = model.requireNoNullableProperties()
val description: String = validated[RequestModel::description]
此外,您还可以提取 validated[RequestModel::description]
到 NoNullableProperties<RequestModel>
的扩展属性:
val ValidRequestModel.description get() = get(RequestModel::description)
哪里ValidRequestModel
是:
typealias ValidRequestModel = NoNullableProperties<RequestModel>
用例:
val validated = model.requireNoNullableProperties()
val description: String = validated.description
关于generics - kotlin - 删除类属性中的可为空性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59015821/