0

我有一种情况,我在 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 或几乎任何其他状态代码,我将没有数据填充“a”通过'f',因此我选择了上述解决方案,我只强制我将始终返回的状态代码不为空,然后将所有其他值默认为空。

我不想沿着将默认值设置为“”或-1之类的东西的路线走下去,因为如果用户不检查状态代码,这些数据总是有可能以某种方式通过。

真的我想传达信息不存在,这似乎可以做到这一点,但我想知道是否有更好的方法。

4

1 回答 1

2

您可以考虑为此使用密封类

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()

(我不知道您的类的显式构造函数是否是故意的,是否有注释等)

这样,如果您有一个成功的调用,您将创建一个Success实例,如果您有一个失败的调用,您可以创建一个Failure甚至不包含表示接收到的数据的属性的实例(想一想,您可以搬到课堂statusCodeResult,这是另一个选择)。

以下是您如何处理这些结果:

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 */ }
    }
}
于 2018-06-20T05:17:36.410 回答