Android
Android पर जावा
खोज…
परिचय
एंड्रॉइड सभी जावा 7 भाषा सुविधाओं और जावा 8 भाषा सुविधाओं के एक सबसेट का समर्थन करता है जो प्लेटफ़ॉर्म संस्करण से भिन्न होता है। यह पृष्ठ उन नई भाषा विशेषताओं का वर्णन करता है जिनका आप उपयोग कर सकते हैं, उन्हें कैसे उपयोग करने के लिए अपनी परियोजना को ठीक से कॉन्फ़िगर करें और किसी भी ज्ञात समस्या का आप सामना कर सकते हैं।
Java 8 में Retrolambda के साथ सबसेट है
Retrolambda आपको Java 7, 6 या 5 पर लैम्ब्डा एक्सप्रेशंस, मेथड रेफरेंस और ट्राई-रिसोर्स स्टेटमेंट के साथ Java 8 कोड चलाने की सुविधा देता है। यह आपके Java 8 संकलित बाईटेकोड को बदलकर ऐसा करता है ताकि यह पुराने Java रनटाइम पर चल सके।
Backported भाषा सुविधाएँ:
अनाम आंतरिक कक्षाओं में परिवर्तित करके लैम्ब्डा अभिव्यक्तियों को वापस लाया जाता है। इसमें बार-बार ऑब्जेक्ट आवंटन से बचने के लिए स्टेटलेस लैम्ब्डा एक्सप्रेशन के लिए एक सिंगलटन इंस्टेंस का उपयोग करने का अनुकूलन शामिल है। विधि संदर्भ मूल रूप से लैम्ब्डा अभिव्यक्तियों के लिए केवल वाक्यविन्यास चीनी हैं और उन्हें उसी तरह से बैकपोर्ट किया गया है।
यदि
Throwable.addSuppressed
वर्जन जावा 8 से नीचे है, तोThrowable.addSuppressed
कॉल हटाकरThrowable.addSuppressed
-रिसोर्स स्टेटमेंट को बैकपोर्ट किया जाता है। यदि आप निगले गए के बजाय लॉग किए जाने वाले दबाए गए अपवादों को पसंद करेंगे, तो कृपया एक सुविधा अनुरोध बनाएं और हम इसे बनाएंगे विन्यास।Objects.requireNonNull
कॉल करने के लिए कॉल के साथ बदल दिया जाता हैObject.getClass
लक्ष्य बाईटकोड संस्करण जावा 7. JDK 9 उपयोग द्वारा उत्पन्न सिंथेटिक अशक्त चेकों नीचे है अगरObjects.requireNonNull
, जबकि पहले JDK संस्करणों का उपयोग कियाObject.getClass
।वैकल्पिक रूप से भी:
डिफ़ॉल्ट तरीकों को एक साथी वर्ग (इंटरफ़ेस नाम + "$") के लिए डिफ़ॉल्ट तरीकों की प्रतिलिपि बनाकर स्थिर तरीकों के रूप में दिया जाता है, इंटरफ़ेस में डिफ़ॉल्ट विधियों को अमूर्त विधियों के साथ प्रतिस्थापित किया जाता है, और सभी वर्गों के लिए आवश्यक विधि कार्यान्वयन जोड़कर जो उस इंटरफ़ेस को लागू करते हैं ।
स्थैतिक तरीकों पर स्थैतिक तरीकों को एक साथी वर्ग (इंटरफ़ेस नाम + "$") के लिए स्थिर तरीकों को स्थानांतरित करके, और नई विधि स्थान को कॉल करने के लिए सभी तरीकों को कॉल करके बदल दिया जाता है।
ज्ञात सीमाएँ:
जावा 8 एपीआई को बैकपोर्ट नहीं करता है
डिफ़ॉल्ट तरीकों और इंटरफेस पर स्थिर तरीकों को वापस करने के लिए सभी बैकपोर्ट वाले इंटरफेस और सभी वर्गों की आवश्यकता होती है जो उन्हें कार्यान्वित करते हैं या रिट्रोलांबा के एक निष्पादन के साथ, उनके स्थैतिक तरीकों को एक साथ वापस करने के लिए कहते हैं। दूसरे शब्दों में, आपको हमेशा एक साफ निर्माण करना चाहिए। इसके अलावा, डिफ़ॉल्ट तरीके बैकपोर्टिंग मॉड्यूल या निर्भरता सीमाओं के पार काम नहीं करेंगे।
यदि भविष्य में JDK 8 बिल्ड प्रत्येक
invokedynamic
कॉल के लिए एक नया वर्ग बनाना बंद कर देता है तो विराम हो सकता है। Retrolambda काम करता है ताकि यह bytecode पर कब्जा कर ले किjava.lang.invoke.LambdaMetafactory
गतिशील रूप से उत्पन्न होता है, इसलिए उस तंत्र के लिए अनुकूलन रेट्रालंबा को तोड़ सकता है।
Retrolambda gradle plugin अपने Android प्रोजेक्ट को Retrolambda के साथ स्वचालित रूप से बनाएगा। नवीनतम संस्करण रिलीज़ पृष्ठ पर पाया जा सकता है।
उपयोग:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:<latest version>'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'com.android.application' //or apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
ज्ञात पहलु:
लैंथ जावा फाइलों पर विफल रहता है जिसमें लैम्ब्डा है। एंड्रॉइड का लिंट जावा 8 सिंटैक्स को नहीं समझता है और चुपचाप या जोर से विफल हो जाएगा। अब एक प्रयोगात्मक कांटा है जो समस्या को ठीक करता है।
Google Play सेवाओं का उपयोग करने से Retrolambda विफल हो जाता है। संस्करण 5.0.77 में बाईटकोड है जो रेट्रोलंबा के साथ असंगत है। यह प्ले सेवाओं के नए संस्करणों में तय किया जाना चाहिए, यदि आप अपडेट कर सकते हैं, तो यह पसंदीदा समाधान होना चाहिए। इस मुद्दे के आसपास काम करने के लिए, आप या तो 4.4.52 जैसे पुराने संस्करण का उपयोग कर सकते हैं या jvm
-noverify
को जोड़-noverify
।
retrolambda {
jvmArgs '-noverify'
}