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
datakeyword vào trướcclasstrong 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
valhoặcvar. - 3, Data class không thể là
abstract,open,sealedhoặcinnerclass (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ó
nameparameter được sử dụng và chỉ có 1 methodcomponent1()được sinh ra.
1 | data class Person(val name: String) { |
- Do
agekhông được sử dụng, do đó nếu 2 variablePersoncóagekhác nhau nhưngnamebằng nhau thì 2 variablePersonvẫ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à
PairvàTriple. - Ví dụ 5: xem source code của
PairvàTripletrongTuples.kt
1 | // `Pair` data class |