data class στην Kotlin είναι ένας ειδικός τύπος κλάσης που προορίζεται αποκλειστικά για αποθήκευση δεδομένων. Ο μεταγλωττιστής δημιουργεί αυτόματα τις μεθόδους equals, hashCode, toString, copy και componentN με βάση τις ιδιότητες που καθορίζονται στο primary constructor. Σύμφωνα με την τεκμηρίωση της JetBrains (2026), το data class επιτρέπει τη μείωση του όγκου του boilerplate κώδικα κατά 50–70% σε σύγκριση με τα αντίστοιχα Java και αποτελεί τη βάση για value-αντικείμενα σε έργα Kotlin.
Κύρια σημεία
data class είναι μια συντακτική κατασκευή της Kotlin που δημιουργεί αυτόματα τυπικές μεθόδους για κλάσεις των οποίων ο κύριος σκοπός είναι η αποθήκευση δεδομένων. Κατά τη δήλωση ενός data class, ο μεταγλωττιστής δημιουργεί υλοποιήσεις των equals, hashCode, toString, copy και componentN βάσει όλων των ιδιοτήτων από το primary constructor.
Σε αντίθεση με τις συνηθισμένες κλάσεις στη Java, όπου ο προγραμματιστής πρέπει να γράφει χειροκίνητα getters, setters, equals, hashCode και toString χρησιμοποιώντας IDE ή βιβλιοθήκες όπως Lombok, η Kotlin παρέχει έναν ενσωματωμένο μηχανισμό. Αυτό όχι μόνο συντομεύει τον κώδικα, αλλά και εγγυάται συνέπεια — οι αυτόματες μέθοδοι αντιστοιχούν πάντα στην τρέχουσα δομή ιδιοτήτων.
Σύμφωνα με τα δεδομένα JetBrains Kotlin Survey (2025), το data class χρησιμοποιείται στο 78% των έργων Kotlin, καθιστώντας το ένα από τα πιο περιζήτητα χαρακτηριστικά της γλώσσας. Είναι ιδιαίτερα δημοφιλές σε αρχιτεκτονικές με DTO, μοντέλα απόκρισης API και αντικείμενα κατάστασης σε MVVM.
data class δηλώνεται με τη λέξη-κλειδί data πριν από το class. Όλες οι ιδιότητες που συμμετέχουν στις αυτόματες μεθόδους καθορίζονται στο primary constructor.
data class User(
val id: Int,
val name: String,
val email: String
)
Μία γραμμή κώδικα αντικαθιστά δεκάδες γραμμές boilerplate στη Java. Ο μεταγλωττιστής δημιουργεί equals, hashCode, toString, copy και component1–component3 και για τις τρεις ιδιότητες.
Οι αυτόματες μέθοδοι περιλαμβάνουν μόνο ιδιότητες από το primary constructor. Εάν δηλώσετε μια ιδιότητα στο σώμα της κλάσης, δεν συμμετέχει στα equals, hashCode, toString και copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// Το cachedPrice ΔΕΝ περιλαμβάνεται στο equals/hashCode/copy
}
Ο primary constructor ενός data class πρέπει να περιέχει τουλάχιστον μία παράμετρο. Όλες οι παράμετροι πρέπει να επισημαίνονται με val ή var. Δεν μπορούν να χρησιμοποιηθούν οι τροποποιητές open, abstract, sealed ή inner για data class.
Τα equals και hashCode δημιουργούνται βάσει των τιμών όλων των ιδιοτήτων από το primary constructor. Δύο στιγμιότυπα data class θεωρούνται ίσα αν όλες οι αντίστοιχες ιδιότητές τους είναι ίσες.
Στη Java, η προεπιλεγμένη σύγκριση αντικειμένων είναι σύγκριση αναφορών (==). Για σύγκριση βάσει τιμής απαιτείται παράκαμψη του equals. Το Kotlin data class το κάνει αυτόματα, επιτρέποντας τη χρήση == για δομική σύγκριση.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // αληθές
Η μέθοδος toString επιστρέφει μια αναγνώσιμη αναπαράσταση του αντικειμένου με ονόματα και τιμές όλων των ιδιοτήτων. Αυτό απλοποιεί σημαντικά την καταγραφή και την αποσφαλμάτωση σε σύγκριση με τη Java, όπου προεπιλεγμένα εμφανίζεται ο hash-κώδικας σε δεκαεξαδική μορφή.
Σύμφωνα με Kotlin Documentation (2026), η μορφή toString του data class είναι: “User(id=1, name=John, email=john@example.com)”. Κατά την αφαίρεση ιδιοτήτων από το primary constructor, το toString ενημερώνεται αυτόματα — ο κίνδυνος αποσυγχρονισμού αποκλείεται.
copy — μία από τις βασικές δυνατότητες του data class. Δημιουργεί ένα επιφανειακό αντίγραφο του αντικειμένου με δυνατότητα αλλαγής των τιμών καθορισμένων ιδιοτήτων.
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = “Confirmed”
copy είναι απαραίτητο σε λειτουργικό στυλ και αρχιτεκτονικές με αμεταβλητότητα (immutability). Αντί για μετάλλαξη του υπάρχοντος αντικειμένου, δημιουργείται ένα νέο αντίγραφο με τροποποιημένα πεδία, καθιστώντας τον κώδικα πιο προβλέψιμο και ασφαλή σε πολυνηματικά σενάρια.
Το data class δημιουργεί αυτόματα συναρτήσεις component1, component2 και ούτω καθεξής για κάθε ιδιότητα με τη σειρά δήλωσής τους. Αυτό επιτρέπει την αποδόμηση του αντικειμένου σε μεταβλητές.
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // “1: Alice (alice@example.com)”
Η αποδόμηση λειτουργεί επίσης σε λάμδα και βρόχους for-each, καθιστώντας το data class βολικό για εργασία με συλλογές.
Πρώτος περιορισμός — το data class δεν υποστηρίζει κληρονομικότητα από άλλο data class. Μπορεί να κληρονομήσει μόνο από συνηθισμένες κλάσεις ή διεπαφές.
Δεύτερος — οι αυτόματες μέθοδοι περιλαμβάνουν μόνο ιδιότητες του primary constructor. Οι ιδιότητες στο σώμα της κλάσης αγνοούνται, που μπορεί να οδηγήσει σε εσφαλμένο equals αν το ξεχάσετε.
Τρίτος — το data class δεν μπορεί να είναι open, abstract, sealed ή inner. Είναι πάντα final.
Τέταρτος — για συλλογές εντός του data class, το copy εκτελεί επιφανειακή αντιγραφή. Η αλλαγή στοιχείων εντός του αντιγραμμένου συνόλου θα επηρεάσει το πρωτότυπο.
Σύμφωνα με Kotlin Best Practices (2026), το data class είναι βέλτιστο για DTO, μοντέλα API, value objects και αντικείμενα κατάστασης. Για εξαρτήματα με επιχειρηματική λογική, συνιστάται η χρήση συνηθισμένων κλάσεων.
Συχνές ερωτήσεις
Όχι, το data class δεν μπορεί να κληρονομήσει άλλο data class. Ωστόσο, μπορεί να κληρονομήσει μια συνηθισμένη κλάση ή να υλοποιήσει διεπαφές.
Τουλάχιστον μία ιδιότητα. Ο μέγιστος αριθμός δεν είναι περιορισμένος, αλλά για αποδόμηση δημιουργείται έως componentN.
Όχι, οι αυτόματες μέθοδοι λαμβάνουν υπόψη μόνο ιδιότητες από το primary constructor. Οι ιδιότητες από το σώμα της κλάσης δεν συμμετέχουν στα equals, hashCode, toString και copy.
Ναι, μπορείτε να παρακάμψετε τα equals, hashCode ή toString στο σώμα του data class. Σε αυτήν την περίπτωση, ο μεταγλωττιστής δεν δημιουργεί δική του υλοποίηση.
Το data class δημιουργεί αυτόματα equals, hashCode, toString, copy και componentN. Μια συνηθισμένη κλάση δεν παρέχει αυτές τις μεθόδους χωρίς χειροκίνητη υλοποίηση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης