Kotlin 数据类

文章目录

定义

Kotlin 数据类可以用于存储数据(当然,不是说普通类不行)。数据类使用data class定义:

kt 复制代码
data class Book(val name: String, val author: String)

数据类必须有主构造方法,括号中只能定义由valvar修饰的成员变量,至少要有一个。

数据类不能用这些修饰符修饰: abstractopensealedinner

编译器自动重写、生成方法

我们可以再定义一个普通类class,对比一下:

kt 复制代码
data class Book(val name: String, val author: String)


class User(val name: String, val password: String)

对于声明为data class的类,会重写或生成以下方法:

  1. equalshashCode。数据类的equals方法会对比每一个成员变量是否相对(我们平时使用==,其实就是去调用对象的equals方法),hashCode也会根据成员变量生成对应的值。若全相对,也会判定两个对象相对,hashCode也会获取到同样的值:

    kt 复制代码
    fun main() {
        val book1 = Book("十日终焉", "杀虫队队员")
        val book2 = Book("十日终焉", "杀虫队队员")
    
        val user1 = User("Zhou-Kt", "******")
        val user2 = User("Zhou-Kt", "******")
    
        println(book1 == book2)
        println(user1 == user2)
        println("${book1.hashCode()}  ${book2.hashCode()}")
        print("${user1.hashCode()}  ${user2.hashCode()}")
    }
    true
    false
    -1278661368  -1278661368
    214126413  396873410
    
  2. toString。数据类的toString方法生成的字符串会比普通类更易于阅读(print会调用toString生成字符串,再输出):

    kt 复制代码
    fun main() {
        println(Book("十日终焉", "杀虫队队员"))
        print(User("Zhou-Kt", "******"))
    }
    Book(name=十日终焉, author=杀虫队队员)
    User@6f539caf
    
  3. componentN(N为整数)。会生成一系列的方法,每一个方法都会按顺序获取到对应成员变量的值:

    kt 复制代码
    fun main() {
        val book = Book("十日终焉", "杀虫队队员")
    
        val (name, author) = book
    
        print("《${book.component1()}》作者:${book.component2()}")
    }
    《十日终焉》作者:杀虫队队员
    

    这一特性可以用于解构声明:

    kt 复制代码
    fun main() {
        val book = Book("十日终焉", "杀虫队队员")
    
        val (name, author) = book
    
        print("《$name》作者:$author")
    }
    《十日终焉》作者:杀虫队队员
    
  4. copy。该方法可以在原对象的基础上生成一个新对象,并且可以指定某一成员属性与原对象不同:

    kt 复制代码
    fun main() {
        val book = Book("十日终焉", "未知")
    
        val newBook = book.copy(author = "杀虫队队员")
    
        println(book)
        print(newBook)
    }
    Book(name=十日终焉, author=未知)
    Book(name=十日终焉, author=杀虫队队员)
    

Note:如果数据类中已经声明了这些方法,则不会再生成。数据类中不能声明与componentNcopy方法冲突的方法(方法名、参数和返回值类型都相同)。

相关推荐
zhangphil2 分钟前
Android简洁缩放Matrix实现图像马赛克,Kotlin
android·kotlin
_Shirley12 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
小白学大数据1 天前
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
爬虫·数据分析·kotlin
guitarjoy1 天前
Kotlin - 协程结构化并发Structured Concurrency
kotlin·协程·coroutinescope·结构化同步
zhangphil2 天前
Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)
android·kotlin
居居飒3 天前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
刘争Stanley4 天前
如何高效调试复杂布局?Layout Inspector 的 Toggle Deep Inspect 完全解析
android·kotlin·android 15·黑屏闪屏白屏
sickworm陈浩4 天前
Java 转 Kotlin 系列:究竟该不该用 lateinit?
android·kotlin
droidHZ5 天前
Compose Multiplatform 之旅—声明式UI
android·kotlin
zhangphil5 天前
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)
android·kotlin