Σε αυτό το άρθρο, θα μάθετε να δημιουργείτε τάξεις δεδομένων στο Kotlin. Θα μάθετε επίσης για τις απαιτήσεις που πρέπει να πληροί η κλάση δεδομένων και τις τυπικές λειτουργίες τους.
Μπορεί να προκύψει μια κατάσταση στην οποία πρέπει να δημιουργήσετε μια τάξη αποκλειστικά για την αποθήκευση δεδομένων. Σε τέτοιες περιπτώσεις, μπορείτε να επισημάνετε την κλάση ως data
να δημιουργήσετε μια κλάση δεδομένων. Για παράδειγμα,
Κατηγορία δεδομένων Πρόσωπο (όνομα val: String, var age: Int)
Για αυτήν την τάξη, ο μεταγλωττιστής δημιουργεί αυτόματα:
copy()
συνάρτηση,equals()
καιhashCode()
ζεύγος, καιtoString()
μορφή του πρωτεύοντος κατασκευαστήcomponentN()
λειτουργίες
Πριν μιλήσουμε λεπτομερώς για αυτά τα χαρακτηριστικά, ας μιλήσουμε για τις απαιτήσεις που πρέπει να πληροί μια κλάση δεδομένων.
Απαιτήσεις κλάσης δεδομένων Kotlin
Εδώ είναι οι απαιτήσεις:
- Ο κύριος κατασκευαστής πρέπει να έχει τουλάχιστον μία παράμετρο.
- Οι παράμετροι του κύριου κατασκευαστή πρέπει να επισημαίνονται είτε
val
(μόνο για ανάγνωση) είτεvar
(ανάγνωση-εγγραφή). - Η τάξη δεν μπορεί να είναι ανοιχτή, αφηρημένη, εσωτερική ή σφραγισμένη.
- Η τάξη μπορεί να επεκτείνει άλλες κατηγορίες ή να εφαρμόσει διεπαφές. Εάν χρησιμοποιείτε την έκδοση Kotlin πριν από την 1.1, η κλάση μπορεί να εφαρμόσει μόνο διεπαφές.
Παράδειγμα: Κατηγορία δεδομένων Kotlin
data class User(val name: String, val age: Int) fun main(args: Array) ( val jack = User("jack", 29) println("name = $(jack.name)") println("age = $(jack.age)") )
Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:
όνομα = ηλικία jack = 29
Όταν δηλώνετε μια κατηγορία δεδομένων, ο compiler δημιουργεί αυτόματα διάφορες λειτουργίες όπως toString()
, equals()
, hashcode()
κλπ πίσω από τα παρασκήνια. Αυτό σας βοηθά να διατηρείτε τον κώδικα συνοπτικό. Εάν είχατε χρησιμοποιήσει Java, θα χρειαστεί να γράψετε πολλούς κωδικούς λέβητα.
Ας χρησιμοποιήσουμε αυτές τις λειτουργίες:
Αντιγραφή
Για μια κλάση δεδομένων, μπορείτε να δημιουργήσετε ένα αντίγραφο ενός αντικειμένου με ορισμένες από τις ιδιότητές του διαφορετικές χρησιμοποιώντας τη copy()
λειτουργία. Ετσι δουλευει:
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) // using copy function to create an object 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, όνομα = 29
μέθοδος toString ()
Η συνάρτηση toString () επιστρέφει μια παράσταση συμβολοσειράς του αντικειμένου.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:
Χρήστης (όνομα = John, ηλικία = 29)
hashCode () και ισούται με ()
Η hasCode()
μέθοδος επιστρέφει κωδικό κατακερματισμού για το αντικείμενο. Εάν δύο αντικείμενα είναι ίδια, hashCode()
παράγει το ίδιο ακέραιο αποτέλεσμα. Συνιστώμενη ανάγνωση: hashCode ()
Οι equals()
αποδόσεις true
αν δύο αντικείμενα είναι ίσα (έχει το ίδιο hashCode()
). Εάν τα αντικείμενα δεν είναι ίδια, equals()
επιστρέφει false
. Προτεινόμενη ανάγνωση: ισούται με ()
data class User(val name: String, val age: Int) fun main(args: Array) ( 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 is equal to u2.") else println("u1 is not equal to u2.") if (u1.equals(u3) == true) println("u1 is equal to u3.") else println("u1 is not equal to u3.") )
Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 είναι ίσο με u2. Το u1 δεν είναι ίσο με το u3.
Καταστρέψεις δηλώσεις
Μπορείτε να καταστρέψετε ένα αντικείμενο σε διάφορες μεταβλητές χρησιμοποιώντας δήλωση καταστροφής. Για παράδειγμα:
κλάση δεδομένων Χρήστης (όνομα val: String, ηλικία val: Int, val φύλο: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:
όνομα = John ηλικία = 29 φύλο = Άνδρας
Αυτό ήταν δυνατό επειδή ο μεταγλωττιστής δημιουργεί componentN()
συναρτήσεις όλες τις ιδιότητες για μια κατηγορία δεδομένων. Για παράδειγμα:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") println(u1.component1()) // John println(u1.component2()) // 29 println(u1.component3()) // "Male" )
Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:
John 29 Male