2010-12-17 12 views
5

एक बात है कि हमेशा जावा में मुझे परेशान करता है:जावा सार्वजनिक कक्षाएं

कैसे आप एक ही सार्वजनिक वर्ग कि नीचे की ओर उपभोक्ताओं द्वारा इस्तेमाल किया जाना चाहिए, लेकिन फिर अच्छी तरह से कक्षाओं में पर निर्भर करता है को व्यवस्थित बना सकता हूँ संकुल?

उदाहरण के लिए (कुछ हद तक योगदान हुआ), मेरे पास एक क्लास UserDao है जो LdapPersistenceHelper और DBPersistenceHelper पर निर्भर करता है। UserDao क्लास com.company.dao नामक पैकेज में बैठी है और मैं चाहता हूं कि दो सहायक मदद com.company.dao.persistencehelper नामक पैकेज में रहें। हालांकि, मैं दो सहायकों को पर्याप्त सामान्य बनाना नहीं चाहता हूं कि वे दूसरों द्वारा उपयोग किए जा सकें। मैं यह कैसे करूँ? अगर मैं सहायकों को "संरक्षित" (वास्तव में, कोई संशोधक नहीं) बनाता हूं तो मैं उन्हें उपयोगकर्ताडाओ से नहीं पहुंच सकता। अगर मैं उन्हें सार्वजनिक करता हूं, तो कोई और उनका उपयोग कर सकता है।

उत्तर

1

एक विकल्प उन्हें सार्वजनिक कक्षा के समान पैकेज में रखना है, लेकिन पैकेज पहुंच के साथ।

यदि आप ओएसजीआई का उपयोग कर रहे हैं, तो आप निर्यात किए गए पैकेजों के सेट से कार्यान्वयन पैकेज छोड़ सकते हैं।

+0

दिलचस्प, मैंने इस समस्या को हल करने के लिए ओएसजीआई का उपयोग करने के बारे में सोचा नहीं था – silk

3

इसे लागू करने का कोई तरीका नहीं है, जब तक कि आप कक्षाओं को उसी पैकेज में न रखें। उप-पैकेज दृश्यता को परिभाषित करने का कोई तरीका नहीं है।

+0

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

+0

हां। लेकिन भाषा दुर्घटनाओं को रोकने के लिए डिज़ाइन की गई है, न कि दुर्भावना। स्ट्रॉस्ट्रप डी एंड ई में सी ++ के लिए समान भेद नोट करता है। –

+0

हाँ, आप कर सकते हैं। सिवाय इसके कि यह जावा है। Lang, lava.util, आदि:) – Bozho

6

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

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

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

+0

जबकि कड़ाई से बोझो इस सवाल का जवाब देते हैं, मुझे यह जवाब बेहतर लगता है क्योंकि यह डिजाइन समस्या – silk

+0

+1 की सराहना करता है, यह अब तक का सबसे अच्छा जवाब है। यदि आप सहायक वर्ग बनाने के लिए तैयार नहीं हैं, तो सार्वजनिक इंटरफ़ेस का पालन करें या उपयोग करने योग्य जेनेरिक उपयोगिता बनें, उनके पास उनके अपने पैकेज में कोई स्थान नहीं है। वास्तव में, यदि वे उपयोगकर्ताडाओ उदाहरण के संदर्भ के बाहर समझ में नहीं आते हैं, तो वे शायद अपनी खुद की कक्षा फ़ाइल में शामिल नहीं हैं। –

+0

@ टिम: वह पेटेंट असत्य। आपके पास पुन: प्रयोज्य कोड की एक संपूर्ण लाइब्रेरी हो सकती है जिसे आप आम तौर पर बाह्य उपयोग के लिए वितरित नहीं करना चाहते हैं और इसलिए उनके साथ भावी बाइनरी संगतता प्रदान करने के लिए निहित अनुबंध। –

1

मैं दूसरों का उपयोग करके दूसरों के बारे में चिंता नहीं करता। बस उन्हें आंतरिक पैकेज के रूप में दस्तावेज करें, शायद उन्हें "आंतरिक" या "impl" पैकेज के नीचे भी डाल दें। अगर कोई भी उन्हें अनुपयुक्त तरीके से उपयोग करता है, तो वे केवल खुद को नुकसान पहुंचा सकते हैं और दोषी ठहरा सकते हैं (केवल एक ही नुकसान उन वर्गों में पिछड़े असंगत परिवर्तनों से निपट सकता है)।

यदि आप मजबूत अलगाव चाहते हैं, तो ओएसजीआई का उपयोग करें।

1

नोट: इस के आसपास एक संभावित तरीका (यदि आप दूसरों के लिए जार वितरित कर रहे हैं) तो गैर-सार्वजनिक रूप से उपभोग योग्य वर्गों को खराब करने के लिए एक obfuscater (मैं ProGuard की सिफारिश करता हूं) का उपयोग करना है; फिर यह जानबूझकर दुर्भावनापूर्ण रोकथाम को रोकता नहीं है, लेकिन यह बहुत स्पष्ट है कि उन वर्गों के साथ डाउनस्ट्रीम संगतता के लिए कोई अनुबंध नहीं है (और यह उन्हें तकनीकी रूप से समझने में मुश्किल बनाता है)।

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