如果可能无法设置数据,除了将 data class 构造函数值设置为 null 之外,还有更好的方法吗
Is there a better way other than setting data class constructor values to null if its possible the data cannot be set
我有一种情况,我在 kotlin 中创建一个休息客户端作为实际学习练习,最近遇到了这个问题:
data class ai constructor(val statusCode: Int,
val a: Long? = null,
val b: Long? = null,
val c: Date? = null,
val d: Long? = null,
val e: String? = null,
val f: String? = null)
问题是这样的,如果我得到 200 返回,我将有数据填充 'a' 到 'f',但如果我得到 401 或几乎任何其他状态代码,我会没有通过 'f' 填充 'a' 的数据,因此我选择了上述解决方案,我只强制我将始终返回的状态代码不为空,然后将所有其他值默认为空。
我不想将默认值设置为 "" 或 -1 之类的东西,因为如果用户不检查状态代码,那么这些数据总是有可能以某种方式通过。
我真的想传达信息不存在,看起来这样就可以了,但我想知道是否有更好的方法。
您可以考虑为此使用 sealed class:
sealed class Result
data class Success constructor(val statusCode: Int = 200,
val a: Long,
val b: Long,
val c: Date,
val d: Long,
val e: String,
val f: String): Result()
data class Failure(val statusCode: Int): Result()
(我不知道你的 class 的显式构造函数是否是故意的,是否有注释等等)
这样,如果您调用成功,您将创建一个 Success
实例,如果调用失败,您可以创建一个 Failure
实例,它甚至不包含表示接收到的数据的属性(想一想,您可以将 statusCode
移动到 Result
class,这是另一种选择)。
下面是处理这些结果的方法:
fun processResult(result: Result) {
when (result) {
is Success -> { /* Use result, which is smart cast to a Success now */ }
is Failure -> { /* Use result, which is smart cast to a Failure now */ }
}
}
我有一种情况,我在 kotlin 中创建一个休息客户端作为实际学习练习,最近遇到了这个问题:
data class ai constructor(val statusCode: Int,
val a: Long? = null,
val b: Long? = null,
val c: Date? = null,
val d: Long? = null,
val e: String? = null,
val f: String? = null)
问题是这样的,如果我得到 200 返回,我将有数据填充 'a' 到 'f',但如果我得到 401 或几乎任何其他状态代码,我会没有通过 'f' 填充 'a' 的数据,因此我选择了上述解决方案,我只强制我将始终返回的状态代码不为空,然后将所有其他值默认为空。
我不想将默认值设置为 "" 或 -1 之类的东西,因为如果用户不检查状态代码,那么这些数据总是有可能以某种方式通过。
我真的想传达信息不存在,看起来这样就可以了,但我想知道是否有更好的方法。
您可以考虑为此使用 sealed class:
sealed class Result
data class Success constructor(val statusCode: Int = 200,
val a: Long,
val b: Long,
val c: Date,
val d: Long,
val e: String,
val f: String): Result()
data class Failure(val statusCode: Int): Result()
(我不知道你的 class 的显式构造函数是否是故意的,是否有注释等等)
这样,如果您调用成功,您将创建一个 Success
实例,如果调用失败,您可以创建一个 Failure
实例,它甚至不包含表示接收到的数据的属性(想一想,您可以将 statusCode
移动到 Result
class,这是另一种选择)。
下面是处理这些结果的方法:
fun processResult(result: Result) {
when (result) {
is Success -> { /* Use result, which is smart cast to a Success now */ }
is Failure -> { /* Use result, which is smart cast to a Failure now */ }
}
}