Lớp dữ liệu Kotlin - Kotlin Data Class
20/06/2023 14:52
Chúng ta thường tạo các lớp để chứa một số dữ liệu trong đó. Trong các lớp như vậy, một số chức năng tiêu chuẩn thường được lấy từ dữ liệu. Trong Kotlin, loại lớp này được gọi là lớp dữ liệu và được đánh dấu là data .
Ví dụ về dữ liệu:
data class Student(val name: String, val roll_no: Int)
Trình biên dịch tự động lấy các hàm sau:
- equals()
- hashCode()
- toString()
- copy()
Các quy tắc để tạo các lớp Dữ liệu –
Các lớp dữ liệu phải đáp ứng các yêu cầu sau để đảm bảo tính nhất quán:
- Hàm tạo chính cần có ít nhất một tham số.
- Tất cả các tham số hàm tạo chính cần được đánh dấu là val hoặc var .
- Các lớp dữ liệu không thể trừu tượng, mở, niêm phong hoặc bên trong.
- Các lớp dữ liệu chỉ có thể thực hiện các giao diện.
toString()
Hàm này trả về một chuỗi gồm tất cả các tham số được xác định trong lớp dữ liệu.
Ví dụ:
fun main(args: Array<String>)
{
//declaring a data class
data class man(val roll: Int,val name: String,val height:Int)
//declaring a variable of the above data class
//and initializing values to all parameters
val man1=man(1,"man",50)
//printing all the details of the data class
println(man1.toString());
}
Đầu ra:
man(roll=1, name=man, height=50)
Lưu ý:
Trình biên dịch chỉ sử dụng các thuộc tính được xác định bên trong hàm tạo chính cho các hàm được tạo tự động.
Nó loại trừ các thuộc tính được khai báo trong thân lớp.
Ví dụ:
fun main(args: Array<String>)
{
//declaring a data class
data class man(val name: String)
{
//property declared in class body
var height: Int = 0;
}
//declaring a variable of the above data class and
//initializing values to all parameters
val man1=man("manish")
//class body properties must be assigned uniquely
man1.height = 70
//this method prints the details of class that
//are declared in primary constructor
println(man1.toString());
//printing the height of man1
println(man1.height);
}
Output:
man(name=manish)
70
Ở đây chiều cao không được sử dụng bởi hàm toString().
copy()
Đôi khi chúng ta cần sao chép một đối tượng, với một số thay đổi trong một số thuộc tính của nó giữ cho tất cả những thứ khác không thay đổi.
Trong trường hợp này, hàm copy () được sử dụng.
Thuộc tính của bản sao()
- Nó sao chép tất cả các đối số hoặc thành viên được xác định trong hàm tạo chính
- Hai đối tượng có thể có cùng giá trị tham số chính và giá trị phần thân của lớp khác nhau nếu được định nghĩa
Declaration of copy()
fun copy(name: String = this.x, age: Int = this.y) = user(x, y)
fun copy(name: String = this.x, age: Int = this.y) = user(x, y)
Example
fun main(args: Array<String>)
{
//declaring a data class
data class man(val name: String, val age: Int)
{
//property declared in class body
var height: Int = 0;
}
val man1 = man("manish",18)
//copying details of man1 with change in name of man
val man2 = man1.copy(name="rahul")
//copying all details of man1 to man3
val man3 = man1.copy();
//declaring heights of individual men
man1.height=100
man2.height=90
man3.height=110
//man1 & man3 have different class body values,
//but same parameter values
//printing info all 3 men
println("${man1} has ${man1.height} cm height")
println("${man2} has ${man2.height} cm height")
println("${man3} has ${man3.height} cm height")
}
Output:
man(name=manish, age=18) has 100 cm height man(name=rahul, age=18) has 90 cm height man(name=manish, age=18) has 110 cm height
hashCode() and equals()
- hàm hashCode () trả về một giá trị mã băm cho đối tượng.
- Phương thức equals () trả về true nếu hai đối tượng có cùng nội dung và nó hoạt động tương tự như “==”, nhưng hoạt động khác với các giá trị Float và Double .
Khai báo hashCode() :
open fun hashCode(): Int
Thuộc tính của hashCode()
- Hai mã hash được khai báo hai lần trên cùng một đối tượng sẽ bằng nhau.
- Nếu hai đối tượng bằng nhau theo phương thức equals () thì mã băm
trả về cũng sẽ giống nhau
fun main(args: Array<String>)
{
//declaring a data class
data class man(val name: String, val age: Int)
val man1 = man("manish",18)
val man2 = man1.copy(name="rahul")
val man3 = man1.copy();
val hash1=man1.hashCode();
val hash2=man2.hashCode();
val hash3=man3.hashCode();
println(hash1)
println(hash2)
println(hash3)
//checking equality of these hash codes
println("hash1 == hash 2 ${hash1.equals(hash2)}")
println("hash2 == hash 3 ${hash2.equals(hash3)}")
println("hash1 == hash 3 ${hash1.equals(hash3)}")
}
Đầu ra:
835510190
-938448478
835510190
hash1 == hash 2 false
hash2 == hash 3 false
hash1 == hash 3 true