2011-01-21 12 views
8

क्या एक जार फ़ाइल में कुछ कक्षाओं को छिपाना वाकई असंभव है?एक जार फ़ाइल में छुपा वर्ग

मैं वर्गों के प्रत्यक्ष त्वरण को और अधिक लचीला रखने की अनुमति नहीं देना चाहता था। केवल इस कारखाने (या एक मुखौटा) इस जार के दृश्य होना चाहिए।

क्या दो परियोजनाओं की तुलना में इस समस्या को हल करने के अलावा कोई अन्य तरीका है? (दो परियोजनाओं: पहले एक वर्ग (कार्यान्वयन) और पहले एक करने के लिए एक दूसरे संदर्भ शामिल हैं और कारखाने में शामिल है, बाद में केवल एक दूसरे संदर्भित किया जाएगा)

+1

मुझे यकीन नहीं है कि "छुपा" से आपका क्या मतलब है। जार फाइलें सिर्फ .zip फाइलें हैं, इसलिए कोई भी उन्हें खोल सकता है और अपनी कक्षा फाइलों को उनके अंदर देख सकता है। – jonescb

+0

मैं सिर्फ यह बचना चाहता हूं कि कक्षाओं का उपयोग तत्कालता के लिए (दुर्घटना से) किया जा सकता है। – nrainer

+1

मुझे लगता है कि आपको अपने वर्गों के उपयोगकर्ता पर भरोसा करना चाहिए और पर्याप्त उपयोग करने के लिए पर्याप्त दस्तावेज़ीकरण प्रदान करना चाहिए और क्या नहीं करना चाहिए। आपके जार का उपयोग कर सभी गलतियों के डेवलपर्स को किसी भी तरह से आने के लिए कोई रास्ता नहीं है। पाठ्यक्रम का एक विकल्प सिर्फ अपने स्वयं के रचनाकारों को इतना जटिल बनाने के लिए है कि कोई भी उन्हें समझ सके और कारखाने के वर्गों में स्वाभाविक रूप से वापस आ जाएगा: डी –

उत्तर

3

मुझे लगता है कि यदि आपकी सार्वजनिक फैक्ट्री विधि "छिपी हुई" चीज़ को वापस करने का प्रयास करती है तो आपको या तो कंपाइलर विफलता या चेतावनी होगी।

नहीं, आप अपने ClassLoader को पुन: कार्यान्वित किए बिना या ओएसजीआई या कुछ भी समान उपयोग किए बिना सार्वजनिक कक्षा को छुपा नहीं सकते हैं।

आप क्या कर सकते हैं कार्यान्वयन से इंटरफ़ेस एपीआई को अलग करना है, उदा। एक परियोजना है जिसमें केवल इंटरफेस और एक अन्य छिद्र होता है जिसमें प्रत्यारोपण होता है। हालांकि, आप अभी भी कार्यान्वयन कक्षाओं को छुपा नहीं सकते हैं।

+0

दो परियोजनाओं को बनाकर मेरा मतलब था। मुझे लगता है कि मैं ऐसा करूँगा भले ही यह परियोजनाओं की संख्या में वृद्धि करे। – nrainer

2

Obfuscation आप किसी भी तरह कर सकते हैं।

+0

सेकेंड किया गया, भले ही यह इसे छुपा न जाए। –

+0

@Elijah * किसी भी तरह * –

+0

इसलिए 'सेकेंड' और +1 –

2

मानक क्लासलोडर्स के साथ एक सादे पुरानी जार फाइलें यह संभव नहीं है। ओएसजीआई इस अवधारणा को किसी अन्य बंडल को केवल कुछ पैकेजों के लिए दृश्यमान बनाने की अवधारणा है, न कि अन्य (यानी सार्वजनिक एपीआई और आंतरिक कार्यान्वयन को अलग करना)।

आप usinf ग्रहण आप this

5

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

+4

ओह वास्तव में, इस तरह कोई भी अभी भी अपने स्वयं के कारखाने वर्ग बनाकर और उन्हें उसी पैकेज में रख कर अपने रचनाकारों को कॉल कर सकता है .. हो सकता है कि आप इन चीजों को छिपाना चाहते हैं _why_ से शुरू करना बेहतर होगा? –

+1

आपको यह मिला। लेकिन सीमा वास्तव में समस्या है। कई कक्षाएं हैं और मैं वास्तव में सभी को एक पैकेज में नहीं रखना चाहता हूं। – nrainer

+1

@ मिक्को: आपकी टिप्पणी के लिए: पैकेज को सील करके हल किया जा सकता है। – nrainer

3

यदि मैं आपका प्रश्न सही ढंग से समझता हूं, तो आप यह सुनिश्चित करना चाहते हैं कि आपकी लाइब्रेरी के उपयोगकर्ताओं को अपने कारखाने का उपयोग करने के लिए स्वयं को रचनाकारों का उपयोग करने के बजाय अपने ऑब्जेक्ट्स को तुरंत चालू करने के लिए मजबूर होना पड़ता है।

जैसा कि मैंने देखा है कि वहां दो संभावनाएं हैं, जिनमें से एक मूर्ख है लेकिन कुछ विशिष्ट मामलों में प्रयोग योग्य है, और दूसरा यह करने का सबसे व्यावहारिक और शायद सबसे अधिक इस्तेमाल किया जाने वाला तरीका है।

  1. आप कारखाने के private inner classes में अपने सभी वर्गों बना सकते हैं। यह काम करेगा यदि आपके पास प्रति वर्ग एक कारखाना था, लेकिन शायद काम करने योग्य है यदि आपके पास कई वर्गों को एक कारखाने के माध्यम से प्रबंधित किया जा रहा है।
  2. आप एक्सेस संशोधक का उपयोग पर कर सकते हैं आपकी कक्षा रचनाकारों तक पहुंच प्रतिबंधित करें। factory pattern का उपयोग करते समय यह अभ्यास है।
+0

पहला वाला है - जैसा कि आपने कहा - मूर्खतापूर्ण। दूसरे को यह समस्या है कि कारखाने को एक ही पैकेज में होना चाहिए। – nrainer

+0

@nrainer :) मैंने इसे मामलों में उपयोग किया है जब आपके पास कई इंस्टेंटेशन विकल्पों के साथ केवल एक एकल वर्ग के लिए एक कारखाना है, लेकिन उस विशिष्ट मामले के अलावा, यह सलाह नहीं दी जाती है। –

1

यदि आप कहते हैं कि "कक्षाओं के प्रत्यक्ष तत्कालता को अधिक लचीला रखने की अनुमति न दें", तो मैं आपको सही तरीके से समझता हूं, एक उचित ढंग से निष्पादित मुखौटा पैटर्न इसे संभालेगा।

उन सभी वर्गों के रचनाकारों को प्रतिबंधित करें जिन्हें आप पैकेज स्कोप में छिपाना चाहते हैं। मुखौटा वर्ग को सार्वजनिक दायरे में खोलें।

http://mindprod.com/jgloss/packagescope.html

"क्या आप एक चर या अपनी कक्षा में विधि है कि आप नहीं है ग्राहकों को अपनी कक्षा सीधे पहुँचने का चाहते हैं, तो यह एक सार्वजनिक, संरक्षित या निजी देना नहीं है घोषणा। जावा के डिज़ाइन में निरीक्षण के कारण, आप स्पष्ट रूप से डिफ़ॉल्ट "पैकेज" पहुंच की घोषणा नहीं कर सकते हैं। पैकेज के अन्य सदस्य इसे देख पाएंगे, लेकिन पैकेज के बाहर कक्षाएं आपकी ओर से विरासत में है, नहीं। संरक्षित अभिगम्यता विशेषता थोड़ा और अधिक स्पष्ट रूप से प्रदान करता है। संरक्षित विधि विरासत कक्षाओं के लिए दृश्यमान है, यहां तक ​​कि का एक ही पैकेज नहीं है। एक पैकेज स्कोप (डिफ़ॉल्ट) विधि नहीं है। यह संरक्षित और पैकेज स्कोप के बीच केवल अंतर है। "

+0

दुर्भाग्य से तो मुखौटा एक ही पैकेज में होना चाहिए। जैसा कि कई वर्ग हैं, मुझे वह नहीं चाहिए। – nrainer

+0

मैंने प्रयोग नहीं किया है, लेकिन आप एक पैकेज में आपको मुखौटा वर्ग रखने में सक्षम होना चाहिए और बच्चों के पैकेज में अपनी कार्यान्वयन कक्षाएं करनी चाहिए। इस तरह मुखौटा और कार्यान्वयन वर्ग सभी एक ही पैकेज में हैं और आपको कई पैकेज रखने का संगठन मिलता है। – Speck

+1

जहाँ तक मुझे पता है कि pck1.subPck1 के पास pck1 से कोई लेना देना नहीं है। इसलिए मुझे नहीं लगता कि यह काम करेगा। (सी # में नेमस्पेस इसे अनुमति देगा। वैसे भी, अगर मैंने सी # का उपयोग किया तो मुझे आंतरिक समस्या के कारण यह समस्या नहीं होगी जो मेरी समस्या का समाधान करेगी।) – nrainer

0

आप एक कस्टम वर्ग लोडर के साथ इस तरह magics कर सकते हैं लेकिन:

  • सही जुदाई केवल अपने वर्ग लोडर के साथ कर्मचारियों के लिए एक परियोजना में उपलब्ध हो जाएगा;
  • यह है कि प्रयास वास्तव में संदिग्ध है बनाने के लिए इस तरह के लोडर लायक है।

ऐसी स्थितियों मैं क्या हम मानक जावा में देख सकते हैं करने के लिए कुछ इसी तरह करना होगा है। Egyou देख javax.xml.stream.XMLInputFactory लेकिन कहीं न कहीं आपहै। यदि आप लिखना पूरी तरह से compilable है:

new com.sun.xml.internal.stream.XMLInputFactoryImpl() 

ही आपने उन्हें :-) एक प्रणाली संपत्ति के साथ शायद ही करेंगे आप वास्तविक क्रियान्वयन किया जाता है कि लोड किए जाने को नियंत्रित कर सकते हैं। मेरे लिए इस तरह के दृष्टिकोण कई परिस्थितियों में ठीक है।

मुझे आशा है कि मैं सही ढंग से अपने प्रश्न समझ लिया है;)

चीयर्स!

1

आपके प्रश्न के दो समाधान हैं जिनमें सभी वर्गों को एक ही पैकेज में रखने में शामिल नहीं है।

सबसे पहले फ्रेंड एक्सेसर/Friend Package पैटर्न (प्रैक्टिकल एपीआई डिज़ाइन, तुलच 2008) में वर्णित पैटर्न का उपयोग करना है।

दूसरा ओएसजीआई का उपयोग करना है। ओएसजीआई इसे कैसे पूरा करता है यह समझाते हुए एक लेख here है।

संबंधित प्रश्न: 1, 2, 3, और 4

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