2016-08-05 10 views
7

कौन सा समाधान बेहतर है? निरर्थक लैम्ब्डा का उपयोग करें या खाली पैराम्बा को डिफ़ॉल्ट पैरामीटर के रूप में पास करें? कोटलिन किसी भी तरह से खाली लैम्ब्डा अनुकूलित करेगा? या नया उदाहरण बनाओ जो कुछ भी नहीं करता?शून्य या खाली लैम्बडा डिफ़ॉल्ट मान के रूप में

class Test1(val action:() -> Unit = {})

दुर्भाग्य से मैं बाइट कोड उत्पन्न समझ में नहीं आता। विश्लेषण

val test11 = Test1()

देता है के बाद decompilation हमें

private static final Test1 test11 = new Test1((Function0)null, 1, (DefaultConstructorMarker)null);

देता है और अंत में के रूप में एक लैम्ब्डा पारित हो जाता है की तरह इस

var1 = (Function0)null.INSTANCE;

संपादित कुछ: छिपा सवाल है : कोटलिन कैसे खाली व्यवहार करता है डिफ़ॉल्ट मूल्य के रूप में lambda?

+0

कौन सा समाधान बेहतर है इस पर निर्भर करता है कि आप क्या हासिल करने या अनुकूलित करने की कोशिश कर रहे हैं? – miensol

+1

मैं अनावश्यक, खाली उदाहरण नहीं लेना चाहता हूं। मुझे पता है कि सबसे आसान समाधान है कि लम्बाडा को कम करने के लिए, लेकिन इसका मतलब बदसूरत निर्माण '' 'कार्रवाई है .invoke()' ''। –

+0

@ PawełByszewski '' 'क्लास टेस्ट 1 (वैल एक्शन:() -> यूनिट = {})' '' के बारे में आपकी क्या चिंताएं हैं? – ruX

उत्तर

10

लैम्बडा पैरामीटर के लिए डिफ़ॉल्ट मान के रूप में शून्य के बजाय खाली लैम्ब्डा पास करने के लिए यह निश्चित रूप से अधिक मूर्खतापूर्ण है।

इंटेलिजे आईडीईए में प्रयुक्त डीकंपलर हमेशा कोटलिन बाइटकोड को विशेष रूप से अच्छी तरह से संभाल नहीं करता है, इसलिए आप इस मामले में अपने आउटपुट में जो देखते हैं वह वास्तव में क्या होता है यह दर्शाता नहीं है। हकीकत में, खाली लैम्ब्डा को एक सिंगलटन नेस्टेड क्लास में संकलित किया जाएगा जो एक खाली शरीर के साथ संबंधित FunctionN इंटरफेस को कार्यान्वित करेगा, और सिंगलटन इंस्टेंस को डिफ़ॉल्ट मान के रूप में उपयोग किया जाएगा।

कोटलिन में डिफ़ॉल्ट पैरामीटर लागू करने के तरीके के बारे में अधिक जानकारी के लिए my talk slides देखें।

+2

लैम्बडा खाली है या नहीं, यह कैसे जांचें? – Sunstrike

+0

@Sunstrike ऐसा करने का कोई तरीका नहीं है। आपको ऐसा क्यों लगता है कि आपको इसकी आवश्यकता है? – yole

+0

एक प्रश्न खोला गया है https://stackoverflow.com/questions/45799825/how-to-check-lambda-emptiness-in-kotlin और संभवतः समाधान – Sunstrike

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