Kotlin 简明教程
Kotlin - Data Classes
在此章节中,我们将学习 Kotlin 数据类。Kotlin 数据类被用来仅保存数据,除了保存数据之外,它没有任何其他功能。
Kotlin 类被定义为数据类需满足以下条件:
-
主构造器需要至少有一个参数。
-
所有主构造器参数需要被标记为 val 或 var。
-
数据类不能是抽象的、开放的、封闭的或内部的。
-
该类可以扩展其他类或者实现界面。如果你使用的 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