Ի՞նչ է տեղի ունենում, երբ մենք օգտագործում ենք լամբդա արտահայտություններ հին 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 տարբերակների համար։