Sobes.tech
Middle

Τι συμβαίνει όταν χρησιμοποιούμε εκφράσεις lambda σε παλαιότερες εκδόσεις Android;

sobes.tech AI

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

Πότε χρησιμοποιούνται οι εκφράσεις lambda σε ένα έργο για παλαιότερες εκδόσεις Android (πριν από το API 24), και μετατρέπει ο μεταγλωττιστής Kotlin ή Java (χρησιμοποιώντας τη σύνταξη lambda από Java 8) αυτές σε ανώνυμες κλάσεις; Αυτή η διαδικασία είναι αυτόματη και πραγματοποιείται με εργαλεία κατασκευής όπως το desugaring (για Java) ή η δημιουργία bytecode σε Kotlin.

Το desugaring είναι μια διαδικασία που επιτρέπει τη χρήση νέων δυνατοτήτων της γλώσσας Java, όπως lambdas, προεπιλεγμένες μεθόδους σε διεπαφές, try-with-resources και άλλα, σε παλαιότερες εκδόσεις Android όπου αυτές οι δυνατότητες δεν είναι διαθέσιμες σε επίπεδο JVM (Dalvik/ART). Τα εργαλεία κατασκευής (π.χ., D8/R8) μετασχηματίζουν το bytecode που παράγεται από τον πηγαίο κώδικα που χρησιμοποιεί αυτές τις νέες δυνατότητες σε bytecode συμβατό με το περιβάλλον εκτέλεσης της στοχευόμενης έκδοσης Android.

Για το Kotlin, ο μεταγλωττιστής μετατρέπει επίσης τις lambdas σε κατάλληλες αναπαραστάσεις bytecode, συχνά χρησιμοποιώντας ανώνυμες κλάσεις. Όταν μεταγλωττίζεται για παλαιότερες εκδόσεις Android, αυτό το παραγόμενο bytecode είναι επίσης συμβατό με το περιβάλλον εκτέλεσης στόχου.

Έτσι, το παραγόμενο bytecode λειτουργεί σε παλαιότερες εκδόσεις Android, αλλά μπορεί να περιέχει πρόσθετες κλάσεις (μία ανώνυμη κλάση για κάθε lambda), κάτι που μπορεί να αυξήσει ελαφρώς το μέγεθος του APK και τον χρόνο εκτέλεσης (λόγω δημιουργίας νέων αντικειμένων).

// Παράδειγμα lambda σε Java
Runnable r = () -> System.out.println("Γειά!");
 r.run();

Μετά το desugaring, αυτό μπορεί να μετατραπεί περίπου σε αυτό το bytecode, το οποίο είναι ισοδύναμο:

// Εμφυτεύμενο αποτέλεσμα desugaring για lambda
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Γειά!");
    }
};
 r.run();

Για το Kotlin, η διαδικασία είναι παρόμοια, ο μεταγλωττιστής μετατρέπει επίσης τις lambdas σε μια ισοδύναμη μορφή.

// Παράδειγμα lambda σε Kotlin
val action = { println("Γειά!") }
action.invoke()

Αυτός ο κώδικας θα μετατραπεί επίσης σε bytecode που χρησιμοποιεί ανώνυμες κλάσεις ή ισοδύνακες κατασκευές, συμβατές με την στοχευόμενη έκδοση Android.

Είναι σημαντικό να σημειωθεί ότι σε σύγχρονα περιβάλλοντα ανάπτυξης Android (Android Studio, Gradle), το desugaring ενεργοποιείται από προεπιλογή για τα περισσότερα έργα που χρησιμοποιούν Kotlin ή συγκεκριμένες εκδόσεις Java. Αυτό καθιστά τη χρήση lambdas και άλλων νέων δυνατοτήτων της γλώσσας απολύτως διαφανή για τον προγραμματιστή, χωρίς επιπλέον βήματα για την υποστήριξη παλαιότερων εκδόσεων Android.