2016-12-07 10 views
15

मैं कोटलिन-स्टडलिब में @JvmSynthetic एनोटेशन में आया हूं, और मैं सोच रहा हूं कि यह क्या है, लेकिन दुर्भाग्यवश, यह अनियंत्रित है।कोटलिन में @ जेवीएम सिंथेटिक का इच्छित उपयोग क्या है?

जहां तक ​​मैं समझता हूं, इसे प्रोग्राम तत्व में लागू करने से संबंधित बाइटकोड तत्वों में synthetic संशोधक जोड़ा जाएगा। परिणामस्वरूप, तत्व जावा से अदृश्य हो जाता है: जावा कोड में

class MyClass { 
    @JvmSynthetic 
    fun f() { } 
} 

कहीं:

MyClass c = new MyClass(); 
c.f() // Error: cannot resolve method f() 

लेकिन इसके साथ ही तत्वों Kotlin कोड में अभी भी दिखाई दे रहे हैं:

val c = MyClass() 
c.f() // OK 

छुपा है गैर-कोटलिन स्रोतों से घोषणाएं @JvmSynthetic का वैध उपयोग करती हैं? क्या यह इरादा उपयोग है? अन्य उपयुक्त उपयोग के मामले क्या हैं?

के बाद से @JvmSynthetic जावा से कार्यों को छुपाता है, वे जावा में अधिरोहित नहीं किया जा सकता या तो (और जब यह एक abstract सदस्य की बात आती है, कॉल तो AbstractMethodError में परिणाम)। यह देखते हुए, क्या मैं जावा स्रोतों में कोटलिन कक्षा के ओवरराइडिंग सदस्यों को प्रतिबंधित करने के लिए @JvmSynthetic का उपयोग कर सकता हूं?

उत्तर

9

सादे जावा में, synthetic विधियां javac कंपाइलर द्वारा उत्पन्न की जाती हैं। आम तौर पर संकलक को नेस्टेड कक्षाओं पर कृत्रिम तरीकों को बनाना चाहिए, जब निजी संशोधक के साथ निर्दिष्ट फ़ील्ड संलग्न कक्षा द्वारा उपयोग किए जाते हैं।

जावा में निम्नलिखित वर्ग को देखते हुए:

public final class SyntheticSample 
{ 
    public static void main(final String[] args) 
    { 
     SyntheticSample.Nested nested = new SyntheticSample.Nested(); 
     out.println("String: " + nested.syntheticString); 
    } 

    private static final class Nested 
    { 
     private String syntheticString = "I'll become a method!"; 
    } 
} 

जब SyntheticSample वर्ग nested.syntheticString क्षेत्र तक पहुँचता है, यह वास्तव में बुला रहा है संकलक (access$100 की तरह कुछ नाम) द्वारा उत्पन्न एक स्थिर synthetic विधि।

भले ही कोटलिन @JvmSynthetic एनोटेशन का खुलासा करे जो सिंथेटिक तरीकों के निर्माण को "मजबूर" करने में सक्षम है, तो मैं सलाह देता हूं कि इसे सामान्य "उपयोगकर्ता" कोड में उपयोग न करें। सिंथेटिक विधियां कंपाइलर द्वारा बनाई गई निम्न-स्तरीय चाल हैं, और हमें रोजमर्रा की कोड में ऐसी चीजों पर भरोसा नहीं करना चाहिए। मुझे लगता है कि यह मानक पुस्तकालय के अन्य हिस्सों का समर्थन करने के लिए है, लेकिन अगर आप उत्सुक हैं (आधिकारिक Kotlin Discussion Forum पर आज़माएं)

+1

अच्छी तरह से, मुझे लगता है कि यह एक खतरनाक टूल जैसा दिखता है जिसे सावधानी से संभालने की आवश्यकता है, आपको जेटब्रेन लोगों से सीधे पूछना चाहिए , लेकिन फिर भी यह 'कोटलिन-स्टडलिब' का हिस्सा है, यह एक सार्वजनिक एपीआई है। यह मुझे लगता है कि '@ जेवीएम सिंथेटिक' के लिए उपयोग के मामलों का उपयोग करना चाहिए जो एक सामान्य डेवलपर (या शायद एक पुस्तकालय/उपकरण डेवलपर) का सामना कर सकता है। इसके अलावा, 'सिंथेटिक' विधियों का उपयोग 'जावैक' द्वारा किया जाता है, फिर केवल घोंसला वाले वर्गों के लिए: कम से कम एक अलग हस्ताक्षर के साथ एक विधि को ओवरराइड करने के लिए (गैर-जेनेरिक लोगों के साथ ओवरराइड जेनेरिक तरीकों सहित)। – hotkey

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