Sobes.tech
Middle

Ի՞նչ է տեղի ունենում, երբ մենք օգտագործում ենք լամբդա արտահայտություններ հին Android տարբերակներում:

sobes.tech AI

Պատասխան AI-ից

Երբ նախագծում օգտագործվում են լամբդա արտահայտություններ հին Android տարբերակների համար (մինչ API 24), Kotlin կամ Java կոմպիլյատորը (Java 8-ի լամբդա սինտաքսիսի օգտագործմամբ) դրանք փոխում է անանուն դասերի։ Այս գործընթացը ավտոմատ է և կատարվում է կառուցման գործիքների միջոցով, ինչպիսիք են desugaring (Java-ի համար) կամ bytecode սերունդ Kotlin-ի համար։

Desugaring-ը գործընթաց է, որը թույլ է տալիս օգտագործել Java լեզվի նոր հնարավորությունները, ինչպիսիք են լամբդաները, նախնական մեթոդները ինտերֆեյսներում, try-with-resources և այլ, ավելի հին Android տարբերակներում, որտեղ այս հնարավորությունները սկզբնականում բացակայում են JVM մակարդակում (Dalvik/ART): Կառուցման գործիքները (օրինակ, D8/R8) փոխակերպում են սերնդի bytecode-ը, որը ստեղծվում է նոր լեզվական հնարավորություններով, հարմարեցված է նպատակային Android տարբերակի գործարկման միջավայրին։

Kotlin-ի համար, կոմպիլյատորը նույնպես փոխում է լամբդաները համապատասխան bytecode ներկայացումների, հաճախ օգտագործելով անանուն դասեր։ Հին Android տարբերակների համար կոմպիլյացիայի ժամանակ, այս սերնդի bytecode-ը նույնպես համատեղելի է նպատակային գործարկման միջավայրի հետ։

Այսպիսով, արդյունքում ստանում ենք bytecode, որը աշխատում է հին Android տարբերակներում, բայց կարող է պարունակել լրացուցիչ դասեր (մեկ անանուն դաս յուրաքանչյուր լամբդայի համար), ինչը կարող է փոքր-ինչ մեծացնել APK-ի չափը և գործարկման ժամանակը (նոր օբյեկտների ստեղծման պատճառով):

// Լամբդա օրինակ Java-ում
Runnable r = () -> System.out.println("Բարև!");
r.run();

Desugaring-ից հետո, դա կարող է փոխարկվել մոտավորապես այս bytecode-ին, որը հավասար է:

// Desugaring-ի էմուլյացված արդյունք լամբդայի համար
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Բարև!");
    }
};
r.run();

Kotlin-ի համար, գործընթացը նման է, կոմպիլյատորը փոխում է լամբդաները համապատասխան ձևի։

// Kotlin-ում լամբդա օրինակ
val action = { println("Բարև!") }
action.invoke()

Այս կոդը նույնպես փոխարկվելու է bytecode, որը օգտագործում է անանուն դասեր կամ համապատասխան կառուցվածքներ, համատեղելի է նպատակային Android տարբերակի հետ։

Անհրաժեշտ է նշել, որ ժամանակակից Android զարգացման միջավայրերում (Android Studio, Gradle) desugaring-ը ակտիվացված է ըստ նախնական կարգավորումների մեծ մասի նախագծերի համար, որոնք օգտագործում են Kotlin կամ որոշ Java տարբերակներ։ Սա դարձնում է լամբդաների և այլ նոր լեզվական հնարավորությունների օգտագործումը լիովին պարզ և առանց լրացուցիչ քայլերի հին Android տարբերակների համար։