English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本文中,您将学习在 Kotlin 中创建数据类。您还将了解数据类必须满足的要求及其标准功能。
可能会出现这样的情况: 您需要创建一个仅用于保存数据的类。在这种情况下,您可以将类标记为 data 以创建数据类。比如说,
data class Person(val name: String, var age: Int)
对于此类,编译器会自动生成:
函数 copy(),equals() 和 hashCode() 以及主要构造函数的 toString() 形式
函数 componentN()
在详细讨论这些函数之前,让我们讨论数据类必须满足的要求。
要求如下:
主构造函数必须至少具有一个参数。
主构造函数的参数必须标记为 val(只读)或 var(读写)。
类不能是开放的、抽象的、内部的或密封的。
该类可以扩展其他类或实现接口。 如果您使用的是 1.1 之前的 Kotlin 版本,则该类只能实现接口。
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val jack = User("jack", 29) println("name = ${jack.name}") println("age = ${jack.age}") }
عند تشغيل هذا البرنامج، الناتج سيكون:
name = jack age = 29
当您声明一个数据类时,编译器会在后台自动生成几个函数,如 toString()、equals()、hashCode() 等。 这有助于保持代码的简洁性。 如果您使用 Java,则需要编写大量样板代码。
让我们使用以下函数:
对于数据类,可以使用 copy() 函数创建具有不同属性的对象副本。 它的工作原理如下:
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) // 使用复制函数创建对象 val u2 = u1.copy(name = "Randy") println("u1: name = ${u1.name}, name = ${u1.age}") println("u2: name = ${u2.name}, name = ${u2.age}") }
عند تشغيل هذا البرنامج، الناتج سيكون:
u1: name = John, name = 29 u2: name = Randy, name = 29
函数 toString() 返回对象的字符串表示形式。
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) println(u1.toString()) }
عند تشغيل هذا البرنامج، الناتج سيكون:
User(name=John, age=29)
يحلل طريقة hasCode() رمز الكائن. إذا كانت الكائنين متساويتين، فإن hashCode() يولد نفس النتيجة الصحيحة.
إذا كانت كلاً من الكائنين متساويتين (hashCode() نفسه)، فإن equals() تعود صحيحة. إذا لم تكن الكائنين متساويتين، تعود equals() خطأ.
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) val u2 = u1.copy() val u3 = u1.copy(name = "Amanda") println("u1 hashCode = ${u1.hashCode()}") println("u2 hashCode = ${u2.hashCode()}") println("u3 hashCode = ${u3.hashCode()}") if (u1.equals(u2) == true) println("u1 يساوي u2.") else println("u1 لا يساوي u2.") if (u1.equals(u3) == true) println("u1 يساوي u3.") else println("u1 لا يساوي u3.") }
عند تشغيل هذا البرنامج، الناتج سيكون:
u1 hashCode = 71750738 u2 hashCode = 71750738 u3 hashCode = 771732263 u1 يساوي u2. u1 لا يساوي u3.
يمكنك استخدام التفكيك الت声明 لتحليل الكائن إلى متغيرات متعددة. على سبيل المثال:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array<String>) { val u1 = User("جون", 29, "ذكر") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") }
عند تشغيل هذا البرنامج، الناتج سيكون:
name = John age = 29 gender = Male
هذا ممكن لأن المسيطر سيقوم بإنشاء جميع خصائص دالة component() الخاصة بفئة البيانات. على سبيل المثال:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array<String>) { val u1 = User("جون", 29, "ذكر") println(u1.component1()) // جون println(u1.component2()) // 29 println(u1.component3()) // "ذكر" }
عند تشغيل هذا البرنامج، الناتج سيكون:
جون 29 ذكر