Eski Android versiyalarida lambda ifodalarini ishlatganda nima bo'ladi?
sobes.tech AI
AIdan javob
Qachon eski Android versiyalari uchun (API 24 dan oldin) loyiha uchun lambda ifodalaridan foydalaniladi va Kotlin yoki Java kompilyatori (Java 8 lambda sintaksisidan foydalanishda) ularni noma'lum sinflarga aylantiradimi? Bu jarayon avtomatik bo'lib, desugaring (Java uchun) yoki Kotlin bytecode ishlab chiqarish kabi qurilish vositalari yordamida amalga oshiriladi.
Desugaring - bu Java tilining yangi imkoniyatlarini, masalan, lambda, interfeyslar ichida default metodlar, try-with-resources va boshqalarni, JVM darajasida (Dalvik/ART) bu imkoniyatlar mavjud bo'lmagan eski Android versiyalarida ishlatishga imkon beradigan jarayon. Qurilish vositalari (masalan, D8/R8) yangi til imkoniyatlarini ishlatgan holda ishlab chiqarilgan bytecode'ni maqsadli Android versiyasining ish muhitiga mos keladigan bytecode'ga aylantiradi.
Kotlin uchun, kompilyator ham lambda'larni mos bytecode vakillarga aylantiradi, ko'pincha noma'lum sinflardan foydalanadi. Eski Android versiyalariga mos keladigan tarzda kompilyatsiya qilingan bu bytecode ham maqsadli ish muhitiga mos keladi.
Shunday qilib, natijaviy bytecode eski Android versiyalarida ishlaydi, lekin qo'shimcha sinflar (har bir lambda uchun bitta noma'lum sinf) bo'lishi mumkin, bu APK hajmini biroz oshirishi va bajarilish vaqtini oshirishi mumkin (yangi obyektlar yaratish sababli).
// Java'da lambda misoli
Runnable r = () -> System.out.println("Salom!");
r.run();
Desugaringdan so'ng, bu taxminan quyidagi bytecode'ga aylantirilishi mumkin, bu esa ekvivalent:
// Desugaring natijasida emulyatsiya qilingan lambda
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Salom!");
}
};
r.run();
Kotlin uchun jarayon o'xshash, kompilyator ham lambda'larni ekvivalent shaklga aylantiradi.
// Kotlin'da lambda misoli
val action = { println("Salom!") }
action.invoke()
Ushbu kod ham noma'lum sinflar yoki ekvivalent tuzilmalar yordamida maqsadli Android versiyasi bilan mos keladigan bytecode'ga aylantiriladi.
Zamonaviy Android ishlab chiqish muhitlarida (Android Studio, Gradle), desugaring standart bo'lib, Kotlin yoki ma'lum Java versiyalaridan foydalanadigan ko'pchilik loyihalarda faollashtirilgan. Bu lambda'lar va boshqa yangi til imkoniyatlaridan foydalanishni ishlab chiquvchi uchun to'liq shaffof qiladi, eski Android versiyalarini qo'llab-quvvatlash uchun qo'shimcha qadamlar talab qilinmaydi.