Κατηγορία δεδομένων Kotlin

Σε αυτό το άρθρο, θα μάθετε να δημιουργείτε τάξεις δεδομένων στο 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

ενδιαφέροντα άρθρα...