面试题答案
一键面试基本定义方式
在Kotlin中,密封类使用 sealed
关键字定义,它只能有有限个(固定的)子类,且这些子类必须与密封类在同一文件中(在 Kotlin 1.5 之前)。例如:
sealed class Result
class Success(val data: String) : Result()
class Error(val message: String) : Result()
特性
- 限制子类数量:密封类的所有直接子类都必须在与密封类相同的文件中声明(Kotlin 1.5 前),这保证了密封类的继承结构是已知且有限的。
- 增强类型安全性:在使用
when
表达式处理密封类实例时,如果when
没有覆盖所有可能的子类,编译器会发出警告,除非使用else
分支。例如:
fun handleResult(result: Result) {
when (result) {
is Success -> println("Success: ${result.data}")
is Error -> println("Error: ${result.message}")
}
// 这里没有 else 分支也不会报错,因为已经覆盖了所有可能的子类
}
实际应用场景
- 状态机:例如在一个网络请求的状态管理中,可定义不同状态。
sealed class NetworkState
class Loading : NetworkState()
class Success(val response: String) : NetworkState()
class Error(val exception: Exception) : NetworkState()
在处理网络请求结果时,通过 when
表达式能清晰地处理不同状态。
2. 解析数据结果:比如解析JSON数据,可能得到成功、失败、格式错误等结果。
sealed class JsonParseResult
class ParseSuccess(val jsonObject: Any) : JsonParseResult()
class ParseError(val errorMessage: String) : JsonParseResult()
class EmptyData : JsonParseResult()
在解析JSON数据的函数返回值使用密封类,调用者能方便地根据不同结果进行处理。