元素2025.12.10

33 阅读2分钟
object classClass02 {
    /**
     * CASE CLASS
     * 样例类,相比较于普通的类,它有三点不同
     * 1. 在创建对象的时候,可以省略 new
     * 2. 默认情况下,属性都是只读的
     * 3. 自己自动添加相关的equals、toString等方法
     *
     * 特别适合用来描述数据。
     */
    case class Stu(name:String, age:Int)

    def main(args: Array[String]): Unit = {
        val stu1 = Stu("小苏", 18)
        // 2. 默认情况下,属性都是只读的
        // stu1.name = "xxx"
        // stu1.age = 19
        val stu2 = Stu("小苏", 18)
        println(stu1)
        println(stu1 == stu2)

        val set1 = Set(stu1, stu2)
        println(set1)
    }
}
  1. 自动生成 toString() :直接打印对象时,输出属性名 + 值(而非默认的内存地址);
  2. 自动生成 equals() 和 hashCode() :基于所有属性进行对象相等性判断(而非引用相等);
  3. 自动生成 componentN() 方法:支持解构赋值,快速提取属性;
  4. 自动生成 copy() 方法:方便创建对象的拷贝(支持修改部分属性);
  5. 语法简洁:创建对象时可省略 new 关键字(Kotlin 通用特性)。

(1)主构造函数必须包含至少一个属性

data class 是为数据而生的,不能定义无参主构造函数(除非所有属性都有默认值):

kotlin

// 错误:主构造函数无属性
// data class EmptyData()

// 正确:所有属性有默认值,支持无参创建
data class User(val id: String = "", val name: String = "未知")
val defaultUser = User() // 可行,属性使用默认值

(2)属性只读 / 可变的选择

  • 用 val 声明:属性只读(不可修改),推荐用于不可变数据(如接口返回结果);
  • 用 var 声明:属性可变(可修改),适用于需要动态更新的数据(如表单对象)。

kotlin

data class MutableUser(var name: String, val id: String)
val user = MutableUser("小夏", "U1001")
user.name = "小夏同学" // 允许修改(var 修饰)
// user.id = "U1002" // 报错(val 修饰,只读)

(3)与集合的配合

由于 data class 重写了 equals() 和 hashCode(),放入 Set(去重集合)时,会自动根据属性去重: