Sobes.tech
Middle

Mis juhtub, kui kasutame lambda avaldisi vanemates Androidi versioonides?

sobes.tech AI

Vastus AI-lt

Kui projektis kasutatakse vanemate Androidi versioonide (kuni API 24) jaoks lambda-väljendeid, siis Kotlin või Java kompilaator (Java 8 lambda-süntaksi kasutamisel) neid teisendab anonüümseteks klassideks. See protsess on automaatne ja teostatakse ehitustööriistade, näiteks desugaringi (Java jaoks) või bytecode generatsiooni Kotlin jaoks abil.

Desugaring on protsess, mis võimaldab kasutada Java keele uusi võimalusi, nagu lambdad, vaikimisi meetodid liidestes, try-with-resources ja teised, vanematel Androidi versioonidel, kus need võimalused algselt puuduvad JVM tasemel (Dalvik/ART). Ehitusvahendid (näiteks D8/R8) teisendavad genereeritud bytecode, mis on loodud uute keelevõimalustega lähtekoodist, sobivaks sihtversiooni Androidi käituskeskkonnale.

Kotlin kompilaator teisendab samuti lambdad vastavatesse bytecode-ks, sageli kasutades anonüümseid klasse. Vanemate Androidi versioonide jaoks kompileeritud bytecode on samuti ühilduv sihtkeskkonnaga.

Seega, lõpptulemusena saame bytecode, mis töötab vanematel Androidi versioonidel, kuid võib sisaldada täiendavaid klasse (üks anonüümne klass iga lambdas), mis võib veidi suurendada APK suurust ja tööaega (uute objektide loomise tõttu).

// Lambda näide Java-s
Runnable r = () -> System.out.println("Tere!");
r.run();

Desugaringi järgselt võib see olla ümber tehtud umbes selliseks bytecode-ks, mis on ekvivalent:

// Desugaringi emuleeritud tulemus lambdaga
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Tere!");
    }
};
r.run();

Kotlini protsess on sarnane, kompilaator teisendab lambdad ekvivalentseks vormiks.

// Kotlin lambd näide
val action = { println("Tere!") }
action.invoke()

See kood teisendatakse samuti bytecode-ks, kasutades anonüümseid klasse või ekvivalentseid konstruktsioone, mis on sobivad sihtversioonile Androidis.

Oluline on märkida, et kaasaegsetes Androidi arenduskeskkondades (Android Studio, Gradle) on desugaring vaikimisi aktiveeritud enamikus projektides, mis kasutavad Kotlin või teatud Java versioone. See muudab lambdad ja teised uued keelevõimalused täielikult arendajale nähtamatuks, ilma täiendavate sammudeta vanemate Androidi versioonide toetamiseks.