面试题答案
一键面试Kotlin 数据类
主要特点
- 自动生成成员函数:数据类会自动生成
equals()
、hashCode()
、toString()
、componentN()
以及copy()
函数。这些函数的实现是基于数据类的属性。 - 不可变(默认):如果数据类所有属性都声明为
val
,那么它的实例是不可变的。 - 简洁的语法:可以简洁地声明和初始化数据对象。
适用场景
适用于存储和传输数据的场景,例如表示数据库中的记录、网络 API 的响应数据等。
定义和使用示例
// 定义数据类
data class User(val name: String, val age: Int)
fun main() {
// 创建数据类实例
val user = User("Alice", 30)
// 使用自动生成的 toString() 函数
println(user) // 输出: User(name=Alice, age=30)
// 使用 copy() 函数创建新实例并修改部分属性
val newUser = user.copy(age = 31)
println(newUser) // 输出: User(name=Alice, age=31)
// 使用自动生成的 equals() 和 hashCode() 函数
val anotherUser = User("Alice", 30)
println(user == anotherUser) // 输出: true
}
Kotlin 密封类
主要特点
- 限制继承:密封类的子类必须在与密封类相同的文件中声明(Kotlin 1.5 之前是这样,之后可以在不同文件,但需在同一模块),这使得代码结构更清晰,知道密封类所有可能的子类型。
- 用于条件式分支:常与
when
表达式一起使用,when
表达式在处理密封类实例时,如果覆盖了所有可能的子类型,就不需要else
分支。
适用场景
适用于表示受限的类层次结构,例如状态机、解析结果等。
定义和使用示例
// 定义密封类
sealed class Result
class Success(val data: String) : Result()
class Failure(val errorMessage: String) : Result()
fun handleResult(result: Result) {
when (result) {
is Success -> println("成功: ${result.data}")
is Failure -> println("失败: ${result.errorMessage}")
}
}
fun main() {
val successResult = Success("操作成功")
val failureResult = Failure("发生错误")
handleResult(successResult)
handleResult(failureResult)
}