I, Data class
- Chúng ta thường xuyên tạo các class với mục đích chính là xử lý data.
- Ở những class như vậy, chúng ta cần thiết phải implement 1 số phương thức liên quan tới data.
- Ví dụ 1: ở
Java
, việc này hoàn toàn làm bằng tay và khá dài dòng
1 | public class User { |
- Kotlin cung cấp cho chúng ta
data class
để những class được tạo có mục đích chính là nắm giữ data. - Bạn chỉ cần thêm
data
keyword vào trướcclass
trong khai báo 1 class. - Ví dụ 2: data class sẽ implement đầy đủ các phương thức hơn so với ví dụ 1
1 | data class User(val name: String, val age: Int) |
- Compiler sẽ tự động compile để implement các function dựa trên các property được khai báo ở primary constructor:
- 1,
equals()
,hashCode()
. - 2,
toString()
với định dạng"User(name=John, age=42)"
. - 3,
ComponentN()
để get các property dựa trên thứ tự sắp xếp của chúng nhưval name: String = person.component1()
,val age: Int = person.component2()
. - 4,
copy()
(mình sẽ nói rõ hơn ở III).
- 1,
- Data class cũng cần phải tuân thủ các quy định sau:
- 1, Primary constructor cần ít nhất 1 parameter.
- 2, Tất cả parameter của primary constructor phải được sử dụng với
val
hoặcvar
. - 3, Data class không thể là
abstract
,open
,sealed
hoặcinner
class (static nested class vãn được nhé).
II, Property ở body class
- Ở trên mình nói nhiều đến parameter ở trong primary constructor, nhưng nếu bạn khai báo property trong body class thì sao ?
- Chỉ có các paramter ở trong primary constructor được sử dụng cho
equals()
,hashCode()
,toString()
,copy()
vàcomponentN()
. - Ví dụ 3: chỉ có
name
parameter được sử dụng và chỉ có 1 methodcomponent1()
được sinh ra.
1 | data class Person(val name: String) { |
- Do
age
không được sử dụng, do đó nếu 2 variablePerson
cóage
khác nhau nhưngname
bằng nhau thì 2 variablePerson
vẫn bằng nhau.
III, Copy()
- Phương thức
copy()
được sử dụng nếu bạn muốn tạo ra 1 Object mới:- 1, có cùng type.
- 2, Object mới copy 1 vài parameter(các paramter không đổi) hoặc copy tất cả.
- Ví dụ 4: class
Person
ở ví dụ 2 implementcopy()
như sau:
1 | data class User(val name: String, val age: Int){ |
IV, Standard data class
- Standard library cung cấp 2 data class là
Pair
vàTriple
. - Ví dụ 5: xem source code của
Pair
vàTriple
trongTuples.kt
1 | // `Pair` data class |