2017-09-18 16 views
15

Modifier for Exports में सिंथेटिक और अनिवार्य संशोधक के बीच का अंतर है कहा गया है किक्या जावा दस्तावेज़ में Java9

MANDATED निर्यात परोक्ष मॉड्यूल घोषणा के स्रोत में घोषित किया गया था।

SYNTHETIC निर्यात स्पष्ट या परोक्ष मॉड्यूल घोषणा के स्रोत में घोषित नहीं किया गया था।

module java.base { 
    ... 
    exports java.util; // type 1 
    exports java.util.concurrent; 
    exports java.util.concurrent.atomic; 
    exports jdk.internal to jdk.jfr; // type 2 
    exports jdk.internal.jmod to 
     jdk.compiler, 
     jdk.jlink; 
    ... 
} 

Qualified Exports इन दो प्रकार वर्णन करते हैं लेकिन वहाँ enum प्रकार का कोई संदर्भ नहीं है:

कुछ module-info.class तों को देखते हुए, मैं वहाँ आम तौर पर प्रयोग के दो प्रकार हैं कि देख सकते हैं। क्या ये दस्तावेज़ों में निर्दिष्ट विभिन्न प्रकार हैं?

प्रश्न 1। सामान्य SYNTHETIC में और MANDATEDExports, ModuleDescriptor, Opens और Requires में के रूप में इस्तेमाल संशोधक हैं। इन दोनों के बीच क्या अंतर है और क्या अभ्यास में किसी दूसरे को पसंद किया जाता है?

प्रश्न 2।Modifier का कोई उदाहरण क्या है यदि मॉड्यूल के स्रोत में घोषित नहीं किया गया है?

+2

आप इन सवालों का जवाब देने से नहीं कर रहे हैं? ;-) – GhostCat

+0

@GostCat हाहा..मुझे लगता है कि मुझे इस के लिए कड़ी मेहनत करनी होगी।बस कहीं भी एक साधारण संदर्भ नहीं मिला। कुछ/बेहतर विवरणों के साथ वापस आने के लिए समुदाय पर भरोसा करेंगे :) – nullpointer

+1

आइए एलन के जवाब देने का इंतजार करें, लेकिन मुझे लगता है कि सिंथेटिक निर्यात स्वचालित मॉड्यूल और अनामित के लिए बनाए जा सकते हैं। ऐसे मॉड्यूल पैकेज निर्यात करते हैं भले ही वे 'निर्यात' खंड घोषित न करें। लेकिन मैं वास्तव में केवल अनुमान लगा रहा हूं ... – Nicolai

उत्तर

1

सिंथेटिक और मनोनीत संशोधकों में अंतर सरल है - जनादेश को पूरी तरह घोषित किया गया था और सिंथेटिक को स्पष्ट रूप से घोषित नहीं किया गया था या स्पष्ट रूप से घोषित नहीं किया गया था। उस पर अच्छे लेख थे और जावा विनिर्देश में सिंथेटिक संशोधक के बारे में विस्तृत स्पष्टीकरण है जिसे पहले जावा के साथ पेश किया गया था। विवरण की पूर्णता के कारण कृत्रिम से संबंधित विवरण नीचे से निकाले गए थे। अंत में संदर्भ खोजें।

सिंथेटिक:

सिंथेटिक विशेषता विशेषताओं में एक निश्चित लंबाई विशेषता है एक classfile, field_info, या method_info संरचना के तालिका (§4.1, §4.5, §4.6)। एक वर्ग सदस्य जो स्रोत कोड में प्रकट नहीं होता है उसे सिंथेटिक विशेषता का उपयोग करके चिह्नित किया जाना चाहिए, अन्यथा इसके ACC_SYNTHETIC ध्वज सेट होना चाहिए। इस आवश्यकता के लिए केवल अपवाद कंपाइलर-जेनरेटेड विधियां हैं जिन्हें कलाकृतियों को कार्यान्वित नहीं किया जाता है, अर्थात् उदाहरण प्रोग्राम प्रारंभिक विधि जावा प्रोग्रामिंग भाषा (§2.9) के डिफ़ॉल्ट कन्स्ट्रक्टर का प्रतिनिधित्व करती है, कक्षा आरंभिक विधि (§2.9), और Enum.values ​​() और Enum.valueOf() विधियां। जावा सिंथेटिक कक्षाएं, विधियां और फ़ील्ड जावा रनटाइम के आंतरिक उद्देश्यों के लिए हैं। कोड लिखने के लिए हमें के बारे में ज्ञान रखने की आवश्यकता नहीं हो सकती है।

सिंथेटिक विशेषता जेडीके रिलीज 1.1 में नेस्टेड कक्षाओं और इंटरफेस का समर्थन करने के लिए पेश की गई थी।

attribute_name_index आइटम के मूल्य attribute_name_index constant_pool तालिका में एक वैध सूचकांक होना चाहिए:

Synthetic_attribute { 
    u2 attribute_name_index; 
    u4 attribute_length; 
} 
Synthetic_attribute संरचना के आइटम

इस प्रकार हैं:

सिंथेटिक विशेषता निम्न स्वरूप है । उस इंडेक्स पर स्थिर_पूल एंट्री एक CONSTANT_Utf8_info (§4.4.7) संरचना स्ट्रिंग "सिंथेटिक" का प्रतिनिधित्व करना चाहिए।

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

अनिवार्य:

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

Module claim 
requires mandated java.base 

रेखा 1. दावे नामक मॉड्यूल को परिभाषित करता है। लाइन 2 में प्रत्येक मॉड्यूल परिभाषित करता है java.base को छोड़कर java.base मॉड्यूल पर निर्भर करता है। इसका मतलब है कि निर्यात स्रोत मॉड्यूल घोषणा में स्पष्ट रूप से घोषित किया गया था।

संदर्भ:

+0

हे! स्टैक ओवरफ्लो में आपका स्वागत है और इसका जवाब देने में इस तरह के प्रयासों को डालने के लिए धन्यवाद। छोटा अनुरोध आप कृपया उस दस्तावेज़ को लिंक कर सकते हैं जिसे आपने संबोधित किया है और उत्तर के प्रारूपण को भी बेहतर बना सकता है। इससे इसकी पठनीयता बढ़ेगी। – nullpointer

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