Kotlin 简明教程

Kotlin - Data Classes

在此章节中,我们将学习 Kotlin 数据类。Kotlin 数据类被用来仅保存数据,除了保存数据之外,它没有任何其他功能。

Kotlin 类被定义为数据类需满足以下条件:

  1. 主构造器需要至少有一个参数。

  2. 所有主构造器参数需要被标记为 val 或 var。

  3. 数据类不能是抽象的、开放的、封闭的或内部的。

  4. 该类可以扩展其他类或者实现界面。如果你使用的 Kotlin 版本低于 1.1,则该类只能实现界面。

Syntax

定义 Kotlin 数据类很简单。如果用 data 关键字标记了 Kotlin 类,则它就变成了数据类。例如:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

Kotlin 数据类的好处在于,当你声明一个 Kotlin 数据类时,编译器将自动生成构造器、toString()、equals()、hashCode() 和额外的 copy() 以及 componentN() 函数。

Example

Kotlin 数据类的实例化方法与其他 Kotlin 类相同:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val book = Book("Kotlin", "Tutorials Point", 10)

   println("Name = ${book.name}")
   println("Publisher = ${book.publisher}")
   println("Score = ${book.reviewScore}")

}

当你运行上述 Kotlin 程序时,它将生成以下输出:

Name = Kotlin
Publisher = Tutorials Point
Score = 10

Copy Function

当我们定义一个 Kotlin 数据类时,copy() 函数将自动创建。此 copy 函数可用于复制一个对象,更改其一些属性,但保持其他属性不变。以下是一个示例:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val original = Book("Kotlin", "Tutorials Point", 10)

   val copied = original.copy(reviewScore=5)

   println("Original Book")
   println("Name = ${original.name}")
   println("Publisher = ${original.publisher}")
   println("Score = ${original.reviewScore}")

   println("Copied Book")
   println("Name = ${copied.name}")
   println("Publisher = ${copied.publisher}")
   println("Score = ${copied.reviewScore}")

}

当你运行上述 Kotlin 程序时,它将生成以下输出:

Original Book
Name = Kotlin
Publisher = Tutorials Point
Score = 10
Copied Book
Name = Kotlin
Publisher = Tutorials Point
Score = 5

toString Function

当我们定义一个 Kotlin 数据类时,toString() 函数也会自动创建。此函数返回对象的字符串表示。以下是一个示例:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val book = Book("Kotlin", "Tutorials Point", 10)


   println(book.toString())

}

当你运行上述 Kotlin 程序时,它将生成以下输出:

Book(name=Kotlin, publisher=Tutorials Point, reviewScore=10)

hashCode() and equals() Functions

hasCode()函数返回对象的哈希值。如果两个对象相等,则 hashCode() 返回对象的相同整数值。

equals() 函数返回 true (如果两个对象相等)或 false (如果两个对象不相等)。

下面是一个示例:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val original = Book("Kotlin", "Tutorials Point", 10)

   val copy1 = original.copy(reviewScore=5)
   val copy2 = original.copy(reviewScore=7)

   println("Original Hashcode = ${original.hashCode()}")
   println("Copy1 Hashcode = ${copy1.hashCode()}")
   println("Copy2 Hashcode = ${copy2.hashCode()}")

   if( copy1.equals(copy2)){
      println("Copy1 is equal to Copy2.")
   }else{
      println("Copy1 is not equal to Copy2.")
   }
}

当你运行上述 Kotlin 程序时,它将生成以下输出:

Original Hashcode = 1957710662
Copy1 Hashcode = 1957710657
Copy2 Hashcode = 1957710659
Copy1 is not equal to Copy2.

Destructuring Declarations

我们可以使用解构声明将一个对象解构为多个变量。例如:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val book = Book("Kotlin", "Tutorials Point", 10)

   val( name, publisher,reviewScore ) = book

   println("Name = $name")
   println("Publisher = $publisher")
   println("Score = $reviewScore")

}

当你运行上述 Kotlin 程序时,它将生成以下输出:

Name = Kotlin
Publisher = Tutorials Point
Score = 10