2011-01-11 7 views
14

में डिफ़ॉल्ट सार्वजनिक पहुंच मैंने पढ़ा कि स्कैला में कोई पैकेज-निजी (जावा में डिफ़ॉल्ट) नहीं है और डिफ़ॉल्ट रूप से सार्वजनिक पहुंच का उपयोग करता है।स्कैला

इस विकल्प के लिए तर्क क्या हैं? क्या यह एक अच्छा अभ्यास है क्योंकि डिफ़ॉल्ट सार्वजनिक पहुंच सब कुछ दिखाई देती है, इसलिए एपीआई का हिस्सा है?

इसका मतलब फ़ील्ड और विधियों को समाहित करने के लिए अतिरिक्त टाइपिंग है (चाहे वह निजी हो, निजी, संरक्षित, एक्सेस स्कॉप्ड हो)।

उत्तर

2

यह ऐसा कुछ है जो बहुत से लोगों को कुछ परेशानी देता है। मैं सुझाव देता हूं कि this प्रविष्टि (वास्तव में पूरी श्रृंखला) को पढ़ा जाए।

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

1

Programming Scala के अनुसार, यह डिफ़ॉल्ट सार्वजनिक की तरह लगता है मुख्य रूप से uniform access principle, जहां ऑपरेटर ओवरलोडिंग एक यह कहीं आसान है चुनने के लिए 'पैकेज-निजी' के रूप में field = newvalue

+0

अच्छी तरह से .. वास्तव में मैंने यहां पढ़ा है (http://joelabrahamsson.com/entry/learning-scala-uniform-access-principle) कि कंपाइलर वर्दी पहुंच के लिए एक गेटर डालने वाला है।लेकिन एक्सेसर सार्वजनिक है – bsr

+0

समान पहुंच सिद्धांत के लिए यह पर्याप्त होना चाहिए कि फ़ील्ड और विधियों के लिए डिफ़ॉल्ट पहुंच स्तर बराबर हैं, उन्हें दोनों को 'सार्वजनिक' होने की आवश्यकता नहीं है। –

25

जावा में के रूप में गेटर निर्धारित करने की अनुमति की वजह से है डिफ़ॉल्ट क्योंकि यह वहां केवल तीन संभावनाओं में से एक है।

स्काला में आप सार्वजनिक उपयोग (public) विरासत (protected[C]), विरासत के बिना पैकेज-निजी एक्सेस (private[C]), वर्ग-निजी एक्सेस (private), वस्तु-निजी उपयोग के साथ, पैकेज-निजी एक्सेस (private[this] के बीच चयन कर सकते हैं), विरासत पहुंच (protected), protected[this] पहुंच (जो भी आप इसे कॉल कर सकते हैं) और, इसके अतिरिक्त, आपके पास कुछ प्रकार का फ़ाइल-निजी एक्सेस संशोधक (sealed) है।

public के अलावा अन्य से डिफ़ॉल्ट का चयन करना मुश्किल है।

,

+1

आपने एक वैध बिंदु उठाया है, फिर भी मैं कहूंगा, हालांकि स्कैला अधिक और बेहतर (संरक्षित दायरे में स्थिरता) विकल्प देता है, डिफ़ॉल्ट कुछ ऐसा होना चाहिए जो कार्यान्वयन को छुपाता हो। उस अर्थ में, आपके बयान में विरासत (निजी [सी]) के बिना पैकेज-निजी पहुंच। मुझे अतिरिक्त टाइपिंग पर कोई फर्क नहीं पड़ता और सहमत है कि यह आईडीई के साथ आसान है, फिर भी पसंद के बेहतर तर्क को लेकर सोच रहा है। – bsr

+0

लेकिन फिर आपको कितनी बार 'निजी [सी] 'की आवश्यकता होगी? और, चूंकि आप संकुल घोंसला कर सकते हैं, कौन सा पैकेज या वर्ग 'सी 'होगा? बाहरीतम बेकार होगा, सबसे छोटा वर्ग वह वर्ग होगा जहां सदस्य परिभाषित किया गया है, इसलिए यह केवल 'निजी' होगा। अभी भी पाठ्यक्रम का एक वैध विकल्प; यह विशेष रूप से पैकेज की चीज है जो मुश्किल हो जाती है। – Debilski

+0

लेकिन ठीक है, वैसे भी बहस करना मुश्किल है क्योंकि यह वही तरीका है और यह उतना बुरा नहीं है जितना लगता है। – Debilski

5

स्काला जावा के अलावा कुछ की दृश्यता को चुनने में कहीं अधिक लचीलापन है (भीतरी तरीकों, एक भी विधि-निजी सूची में जोड़ सकते हैं ... ध्यान में रखते हुए) हालांकि जावा दृश्यता नियमों के कुछ से संबंधित नेस्टेड कक्षाएं स्कैला में अनुवाद योग्य नहीं हैं।

और, हाँ, स्कैला में पैकेज-प्राइवेट है। इसे स्कैला में private[package] के रूप में लिखा गया है।

कारण स्कैला public डिफ़ॉल्ट बनाता है क्योंकि यह सबसे आम दृश्यता है। "अतिरिक्त टाइपिंग" वास्तव में कम टाइपिंग है, क्योंकि सदस्यों को निजी या सुरक्षित बनाने के लिए यह कहीं अधिक असामान्य है।

जावा में उस नियम का एक अपवाद फ़ील्ड है, जिसे निजी बनाया जाना चाहिए ताकि कोई ग्राहक तोड़ने के बिना कार्यान्वयन के विवरण को बदलने में सक्षम हो। इसका एक व्यावहारिक परिणाम फ़ील्ड के साथ कक्षाएं और फिर प्रत्येक क्षेत्र के लिए गेटर्स और सेटर्स हैं।

स्कैला में, क्योंकि कोई val या var को def के साथ प्रतिस्थापित करने में सक्षम हो सकता है, इसकी आवश्यकता नहीं है।

+0

'सदस्यों को निजी या संरक्षित बनाने के लिए यह कहीं अधिक असामान्य है' यह गेटर्स और/या सेटर्स के साथ विशेषताओं के लिए सच हो सकता है, लेकिन मैं सामान्य मामले में असहमत हूं। सार्वजनिक एपीआई की तुलना में बहुत अधिक निजी कार्यान्वयन विवरण हैं, क्योंकि एपीआई उच्च स्तरीय तरीकों का खुलासा करता है – Dici