Ποιο είναι το χαρακτηριστικό των αντιπροσώπων ιδιοτήτων;
sobes.tech AI
Απάντηση από AI
Οι delegations ιδιοτήτων στο Kotlin επιτρέπουν τη μεταφορά της λογικής ανάκτησης και ορισμού της τιμής μιας ιδιότητας σε μια ξεχωριστή βοηθητική κλάση που ονομάζεται delegator.
Χαρακτηριστικά:
-
Κατανόηση του
getValueκαιsetValue: Για ιδιότητες που είναι διαθέσιμες για ανάγνωση (val), ο delegator πρέπει να έχει μια μέθοδοgetValue. Για ιδιότητες που είναι διαθέσιμες για ανάγνωση και εγγραφή (var), ο delegator πρέπει να έχει τόσοgetValueόσο καιsetValue. Αυτές οι μέθοδοι λαμβάνουν ως παραμέτρους:- Μια αναφορά στο αντικείμενο που περιέχει την ιδιότητα (για μέλη κλάσεων).
- Μεταδεδομένα της ιδιότητας με τη μορφή ενός αντικειμένου
KProperty.
-
Τυπικοί delegators: Το Kotlin παρέχει μια σειρά από τυπικούς delegators:
lazy: Για καθυστερημένη αρχικοποίηση της ιδιότητας.observable: Για την εκτέλεση μιας ενέργειας κατά την αλλαγή της τιμής της ιδιότητας.vetoable: Για την εκτέλεση μιας ενέργειας κατά την αλλαγή της τιμής της ιδιότητας, με δυνατότητα ακύρωσης της αλλαγής.- Delegators για χάρτες: Η ιδιότητα μπορεί να αποθηκευτεί σε ένα
Map.
-
Τυχαίοι delegators: Μπορείτε να δημιουργήσετε δικούς σας κλάσεις delegator. Η κλάση πρέπει να υλοποιεί τις διεπαφές
ReadOnlyProperty(γιαval) ήReadWriteProperty(γιαvar).
Παράδειγμα χρήσης του lazy:
// Το πεδίο αρχικοποιείται μόνο κατά την πρώτη πρόσβαση
val lazyValue: String by lazy {
println("Υπολογισμός τιμής")
"Hello"
}
Παράδειγμα χρήσης του observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<κανένα όνομα>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Παράδειγμα προσαρμοσμένου delegator:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, τιμή ιδιότητας '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, η τιμή της ιδιότητας '${property.name}' άλλαξε σε '$value'")
}
}
class Example {
var p: String by Delegate()
}