MST
星途 面试题库

面试题:Kotlin密封类的基本特性及应用场景

请阐述Kotlin密封类的基本定义方式、特性,并举出至少两个适合使用密封类的实际应用场景。
48.8万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

基本定义方式

在Kotlin中,密封类使用 sealed 关键字定义,它只能有有限个(固定的)子类,且这些子类必须与密封类在同一文件中(在 Kotlin 1.5 之前)。例如:

sealed class Result
class Success(val data: String) : Result()
class Error(val message: String) : Result()

特性

  1. 限制子类数量:密封类的所有直接子类都必须在与密封类相同的文件中声明(Kotlin 1.5 前),这保证了密封类的继承结构是已知且有限的。
  2. 增强类型安全性:在使用 when 表达式处理密封类实例时,如果 when 没有覆盖所有可能的子类,编译器会发出警告,除非使用 else 分支。例如:
fun handleResult(result: Result) {
    when (result) {
        is Success -> println("Success: ${result.data}")
        is Error -> println("Error: ${result.message}")
    }
    // 这里没有 else 分支也不会报错,因为已经覆盖了所有可能的子类
}

实际应用场景

  1. 状态机:例如在一个网络请求的状态管理中,可定义不同状态。
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数据的函数返回值使用密封类,调用者能方便地根据不同结果进行处理。