2016-03-28 10 views
6

गुमनाम आंतरिक कक्षाओं के विपरीत, जावा 8 लैम्बडास संलग्न (अभिभावक) वर्ग के संदर्भ नहीं रखता है। लैम्बडास के लिए एंड्रॉइड एन adds supportएंड्रॉइड एन जैक कंपाइलर में लैम्बडास कक्षा को संलग्न करने के संदर्भ रखते हैं?

हालांकि, वे लिंक राज्यों में नोट के रूप में, पिछली संगतता के लिए गुमनाम भीतरी वर्गों का उपयोग Jack संकलक में लागू कर रहे हैं।

इसका मतलब यह संकलित एंड्रॉयड कक्षाओं में है कि lambdas जैक (और नहीं retrolambda) का उपयोग कर संलग्नित क्लास के लिए संदर्भ का आयोजन करेगा करता है?

मुझे पता है कि एक कारण है कि कई लोगों को उत्साहित थे lambdas के बारे में जब उन्हें प्रयोग Fragment या Activity लीक से बचने के लिए है, लेकिन एक सरसरी नज़र में, यह jack संकलक का उपयोग कर कि लाभ नहीं देंगे तरह दिखता है।

+1

संभावित डुप्लिकेट [क्या जावा 8 लैम्बडास अज्ञात वर्गों जैसे उनके संलग्न उदाहरण का संदर्भ बनाए रखता है?] (Http://stackoverflow.com/questions/28446626/do-java8-lambdas-maintain-a-reference-to-their -enclosing-उदाहरण की तरह-अनाम) –

+1

@AndreClassen, उस सवाल का जैक को कवर नहीं करता है, लेकिन तुम सही हो, यह एक शिकार हो सकता है अगर retrolambda भी बाईटकोड स्तर पर गुमनाम भीतरी वर्गों के लिए lambdas decompiles। –

+0

बीटीडब्ल्यू, आपकी धारणा है कि जावा 8 लैम्बडास कभी भी संलग्न उदाहरण का संदर्भ नहीं रखता है - वे निश्चित रूप से करते हैं यदि उन्हें आवृत्ति चर को कैप्चर करना है। –

उत्तर

5

मुझे लगता है कि वाक्यांश "गुमनाम वर्ग" भी सचमुच यहाँ व्याख्या नहीं की जानी चाहिए। मेरी समझ में, एकमात्र चीज जो वे हमें बताना चाहते हैं वह यह है कि जैक संकलन समय पर कक्षाएं उत्पन्न करता है (जावा 8 के रनटाइम दृष्टिकोण के विपरीत)।

JackIrBuilder कोड मुझे लगता है कि चाहते हैं कि उत्पन्न आईआर बहुत बाईटकोड कि retrolambda द्वारा उत्पन्न की जाएगी के समान दिखता है से

जैक संलग्नक प्रकार में लैम्ब्डा बॉडी युक्त सिंथेटिक विधि बनाने लगता है और केवल उन मामलों में जेनरेट क्लास के कन्स्ट्रक्टर को संलग्न उदाहरण के संदर्भ को पास करता है, यानी जब संलग्न उदाहरण के सदस्य हैं पकड़े।

संदर्भ: https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93/jack/src/com/android/jack/ir/impl/JackIrBuilder.java

तो, मैं क्या समझ से, जवाब है: केवल जब कुछ enclosing उदाहरण से कब्जा कर लिया जाना चाहिए।

संबंधित मुद्दे