Sobes.tech
Middle

Ποιο είναι το χαρακτηριστικό των αντιπροσώπων ιδιοτήτων;

sobes.tech AI

Απάντηση από AI

Οι delegations ιδιοτήτων στο Kotlin επιτρέπουν τη μεταφορά της λογικής ανάκτησης και ορισμού της τιμής μιας ιδιότητας σε μια ξεχωριστή βοηθητική κλάση που ονομάζεται delegator.

Χαρακτηριστικά:

  1. Κατανόηση του getValue και setValue: Για ιδιότητες που είναι διαθέσιμες για ανάγνωση (val), ο delegator πρέπει να έχει μια μέθοδο getValue. Για ιδιότητες που είναι διαθέσιμες για ανάγνωση και εγγραφή (var), ο delegator πρέπει να έχει τόσο getValue όσο και setValue. Αυτές οι μέθοδοι λαμβάνουν ως παραμέτρους:

    • Μια αναφορά στο αντικείμενο που περιέχει την ιδιότητα (για μέλη κλάσεων).
    • Μεταδεδομένα της ιδιότητας με τη μορφή ενός αντικειμένου KProperty.
  2. Τυπικοί delegators: Το Kotlin παρέχει μια σειρά από τυπικούς delegators:

    • lazy: Για καθυστερημένη αρχικοποίηση της ιδιότητας.
    • observable: Για την εκτέλεση μιας ενέργειας κατά την αλλαγή της τιμής της ιδιότητας.
    • vetoable: Για την εκτέλεση μιας ενέργειας κατά την αλλαγή της τιμής της ιδιότητας, με δυνατότητα ακύρωσης της αλλαγής.
    • Delegators για χάρτες: Η ιδιότητα μπορεί να αποθηκευτεί σε ένα Map.
  3. Τυχαίοι 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()
}