Kotlin 数据类

1、语法

data 修饰的类

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

编译器自动主构造函数中声明的所有属性导出以下成员:

  • .equals()/.hashCode() 对
  • .toString()  格式是 "User(name=John, age=42)"
  • .componentN() 按声明顺序对应于所有属性
  • .copy() 函数
2、规则

数据类必须满足以下要求:

  • 主构造函数需要至少有一个参数
  • 主构造函数的所有参数需要标记为 val 或 var
  • 数据类不能是抽象、开放、密封或者内部的

数据类成员的生成遵循关于成员继承的这些规则:

  • 如果在数据类体中有显式实现 .equals()、 .hashCode() 或者 .toString(),或者这些函数在父类中有 final 实现,那么不会生成这些函数,而会使用现有函数
  • 如果超类型具有 open 的 .componentN() 函数并且返回兼容的类型, 那么会为数据类生成相应的函数,并覆盖超类的实现;如果超类型的这些函数由于签名不兼容或者是 final 而导致无法覆盖,那么会报错
  • 不允许为 .componentN() 以及 .copy() 函数提供显式实现
3、类体中属性

声明在类体中的属性,将在生成的实现中被排除

data class Person(val name: String) {  // 编译器只使用主构造函数内部定义的属性
    var age: Int = 0                   // 被编译器排除
}

fun main() {

    val person1 = Person("John")
    val person2 = Person("John")
    person1.age = 10
    person2.age = 20

    println("person1 == person2: ${person1 == person2}")
    // person1 == person2: true        // age被排除,只检查name属性的相等性

    println("person1 with age ${person1.age}: ${person1}")
    // person1 with age 10: Person(name=John)

    println("person2 with age ${person2.age}: ${person2}")
    // person2 with age 20: Person(name=John)

}
 4、复制

使用.copy()函数复制对象,允许保持某些属性不变的同时修改一些属性

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
5、解构

component 函数 可在解构中使用

val jane = User("Jane", 35)            // 数据类对象
val (name, age) = jane                 // 解构对象 
println("$name, $age years of age") 
// Jane, 35 years of age

相关推荐

  1. Kotlin 数据

    2023-12-28 00:08:01       57 阅读
  2. Kotlin数据

    2023-12-28 00:08:01       63 阅读
  3. kotlin data clas 数据

    2023-12-28 00:08:01       53 阅读
  4. Kotlin 中的数据

    2023-12-28 00:08:01       37 阅读
  5. Kotlin 中的数据

    2023-12-28 00:08:01       37 阅读
  6. Kotlin 数据(Data Class)

    2023-12-28 00:08:01       29 阅读
  7. Kotlin单例、数据、静态

    2023-12-28 00:08:01       27 阅读
  8. Kotlin

    2023-12-28 00:08:01       60 阅读
  9. Kotlin-

    2023-12-28 00:08:01       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 00:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 00:08:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 00:08:01       82 阅读
  4. Python语言-面向对象

    2023-12-28 00:08:01       91 阅读

热门阅读

  1. JVM钩子

    2023-12-28 00:08:01       55 阅读
  2. 什么是 MVVM?

    2023-12-28 00:08:01       56 阅读
  3. 深度学习中的收敛是什么意思?

    2023-12-28 00:08:01       51 阅读
  4. Linux - 记录问题:Ubuntu查看文件夹大小

    2023-12-28 00:08:01       59 阅读
  5. android 四大组件和handler、looper

    2023-12-28 00:08:01       49 阅读
  6. Python并发编程

    2023-12-28 00:08:01       62 阅读
  7. linux下如何完成RPM打包?

    2023-12-28 00:08:01       57 阅读
  8. P8598 [蓝桥杯 2013 省 AB] 错误票据

    2023-12-28 00:08:01       58 阅读
  9. Springboot 两种方式配置启动热部署(图文界面)

    2023-12-28 00:08:01       60 阅读