Ma'lumotlar sinflari
Ba'zan sinflar faqat ba'zi ma'lumotlarni saqlash uchun kerak bo'ladi. Kotlinda bunday sinflar ma'lumotlar sinflari deb ataladi. Ular ma'lumotlar modifikatori bilan aniqlanadi :
Bunday sinfni kompilyatsiya qilishda kompilyator avtomatik ravishda sinfga o'ziga xos dasturga ega bo'lgan funktsiyalarni qo'shadi, bu sinfning asosiy konstruktorda aniqlangan xususiyatlarini hisobga oladi:
teng () : tenglik uchun ikkita ob'ektni solishtiradi
hashCode () : ob'ektning xash kodini qaytaradi
toString () : ob'ektning satrli ko'rinishini qaytaradi
nusxa ko'chirish () : ob'ekt ma'lumotlarini boshqa ob'ektga ko'chiradi
Masalan, toString()ob'ektning satrli tasvirini qaytaradigan funktsiyani olaylik :
1
2018-05-01 xoxlasa buladi 121 2
3
4
5
6
7
|
fun main() {
val alice: Person = Person("Alice", 24)
println(alice.toString())
}
class Person(val name: String, val age: Int)
|
Dasturning chiqishi quyidagicha bo'ladi:
Shaxs @ 2a18f23c
Odatiy bo'lib, ob'ektning satr tasviri bizga deyarli hech narsa aytmaydi. Qoida tariqasida, bu funksiya ob'ekt holatini ko'rsatish uchun mo'ljallangan, ammo buning uchun uni bekor qilish kerak. Biroq, endi ma'lumotlar ta'rifini sinf ta'rifiga qo'shamiz :
1
|
data class Person(val name: String, val age: Int)
|
Va natija boshqacha bo'ladi:
Shaxs (ismi = Elis, yoshi = 24)
Ya'ni, ob'ektda qanday ma'lumotlar saqlanganligini, ular qanday qadriyatlarga ega ekanligini ko'rishimiz mumkin. Xuddi shu narsa boshqa barcha funktsiyalar uchun ham amal qiladi. Shunday qilib, ma'lumotlar sinflari bo'lsa, bizda bu funktsiyalar uchun tayyor dastur mavjud. Ularni qo'lda bekor qilish shart emas. Ammo biz ushbu amaliyotdan qoniqmasligimiz mumkin, keyin biz o'zimizni belgilashimiz mumkin:
1
2018-05-01 xoxlasa buladi 121 2
3
4
5
|
data class Person(val name: String, val age: Int){
override fun toString(): String {
return "Name: $name Age: $age"
}
}
|
Bunday holda, toString()kompilyator funktsiyaning bajarilishini aniqlamaydi .
Yana bir yaxshi misol - ma'lumotlarni nusxalash:
1
2018-05-01 xoxlasa buladi 121 2
3
4
5
6
7
sakkiz
to'qqiz
|
fun main() {
val alice: Person = Person("Alice", 24)
val kate = alice.copy(name = "Kate")
println(alice.toString()) // Person(name=Alice, age=24)
println(kate.toString()) // Person(name=Kate, age=24)
}
data class Person(var name: String, var age: Int)
|
Shunga qaramay, kompilyator biz foydalanishimiz mumkin bo'lgan standart nusxa ko'chirish funktsiyasini yaratadi. Agar ob'ekt uchun ba'zi ma'lumotlar boshqacha bo'lishini istasak, yuqoridagi misoldagi name xossasida bo'lgani kabi ularni nomli arglar ko'rinishida nusxa ko'chirish funksiyasida ko'rsatishimiz mumkin.
Bundan tashqari, sinfni ma'lumotlar sinfi sifatida aniqlash uchun u bir qancha shartlarga javob berishi kerak:
Asosiy konstruktor kamida bitta parametrga ega bo'lishi kerak
Birlamchi konstruktorning barcha parametrlaridan oldin val yoki var kalit so'zlari bo'lishi kerak , ya'ni xususiyatlarni belgilaydi
Asosiy konstruktordan tashqarida aniqlangan xususiyatlar toString, equals va hashCode funksiyalarida ishlatilmaydi.
Sinf ochiq , mavhum , muhrlangan yoki ichki modifikatorlar bilan aniqlanmasligi kerak .
Shuni ham ta'kidlash joizki, biz birlamchi konstruktordagi xususiyatlarni val orqali ham, var orqali ham aniqlay olamiz, masalan:
1
|
data class Person(var name: String, var age: Int)
|
Ammo umuman olganda, bir qator vaziyatlarda xususiyatlarni val orqali aniqlash, ya'ni ularni o'zgarmas qilish tavsiya etiladi, chunki ular asosida HashMap kabi to'plamda ob'ekt kaliti sifatida ishlatiladigan xesh kodini hisoblab chiqadi. .
Do'stlaringiz bilan baham: |