欢迎光临
我们一直在努力

Kotlin数据类与密封类实战指南

Kotlin 数据类与密封类详解

数据类(Data Class)

数据类是 Kotlin 中用于存储数据的特殊类,自动生成 equals()、hashCode()、toString() 和 copy() 等方法,简化了数据模型的实现。

定义一个数据类:

data class User(val name: String, val age: Int)

自动生成的方法示例:

val user1 = User("Alice", 25)
val user2 = User("Alice", 25)

println(user1 == user2) // true,自动生成 equals()
println(user1.hashCode()) // 相同值生成相同哈希码
println(user1.toString()) // 输出:User(name=Alice, age=25)

// copy() 方法允许修改部分属性
val user3 = user1.copy(age = 26)
println(user3) // 输出:User(name=Alice, age=26)

数据类的限制:

  • 主构造函数必须至少有一个参数。
  • 参数必须标记为 val 或 var。
  • 不能是抽象类、开放类(open)、密封类或内部类。
密封类(Sealed Class)

密封类用于表示受限的类层次结构,子类必须定义在同一个文件中,常用于状态或表达式的封装。

定义一个密封类及其子类:

sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}

使用 when 表达式处理密封类:

fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Data: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
Result.Loading -> println("Loading…")
}
}

val success = Result.Success("Loaded successfully")
handleResult(success) // 输出:Data: Loaded successfully

密封类的优势:

  • 子类类型固定,编译器可检查 when 表达式是否覆盖所有情况。
  • 适合实现状态机、API 响应等场景。
数据类与密封类的结合

数据类常用于密封类的子类,例如网络请求结果封装:

sealed class ApiResponse {
data class Success(val data: User) : ApiResponse()
data class Failure(val error: String) : ApiResponse()
}

fun processResponse(response: ApiResponse) {
when (response) {
is ApiResponse.Success -> println("User: ${response.data}")
is ApiResponse.Failure -> println("Error: ${response.error}")
}
}

实际应用示例

以下是一个完整的示例,结合数据类和密封类实现用户管理:

data class User(val id: Int, val name: String)

sealed class UserAction {
data class Add(val user: User) : UserAction()
data class Delete(val id: Int) : UserAction()
object Refresh : UserAction()
}

fun executeAction(action: UserAction) {
when (action) {
is UserAction.Add -> println("Added user: ${action.user}")
is UserAction.Delete -> println("Deleted user ID: ${action.id}")
UserAction.Refresh -> println("Refreshing list…")
}
}

val action = UserAction.Add(User(1, "Bob"))
executeAction(action) // 输出:Added user: User(id=1, name=Bob)

通过数据类和密封类的组合,可以高效地实现类型安全的数据处理和状态管理。

赞(0)
未经允许不得转载:171主机测评 » Kotlin数据类与密封类实战指南
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址