यहाँ ज्यादातर जवाबों में कहा गया है कि जावा में एक सबपैकेज जैसी कोई चीज नहीं है, लेकिन यह कड़ाई से सटीक नहीं है। यह शब्द जावा भाषा विनिर्देश में जावा 6 के रूप में वापस आ गया है, और शायद आगे पीछे (जावा के पुराने संस्करणों के लिए जेएलएस का स्वतंत्र रूप से सुलभ संस्करण नहीं लगता है)। जावा 6 के बाद से JPG में उपपैकेज की भाषा बहुत ज्यादा नहीं बदली है।
एक पैकेज के सदस्य इसके उप पैकेज हैं और सभी शीर्ष स्तरीय वर्ग प्रकार और पैकेज के सभी संकलन इकाइयों में घोषित शीर्ष स्तरीय इंटरफ़ेस प्रकार हैं।
उदाहरण के लिए, जावा एसई प्लेटफॉर्म एपीआई में:
- पैकेज
java
सबपैकेज है awt
, applet
, io
, lang
, net
, और util
, लेकिन कोई संकलन इकाइयों।
- पैकेज
java.awt
में उप नाम दिया गया है image
, साथ ही कई संकलन इकाइयाँ हैं जिनमें वर्ग और इंटरफ़ेस प्रकार की घोषणाएँ हैं।
उप-पैकेज अवधारणा प्रासंगिक है, जैसा कि संकुल और वर्ग / इंटरफेस के बीच नामकरण की बाधाओं को लागू करता है:
एक पैकेज में एक ही नाम के दो सदस्य या संकलन-समय त्रुटि परिणाम नहीं हो सकते हैं।
यहाँ कुछ उदाहरण हैं:
- क्योंकि पैकेज
java.awt
में एक सबपैकेज है image
, यह (या नहीं) नाम के वर्ग या इंटरफ़ेस प्रकार की घोषणा को शामिल नहीं कर सकता है image
।
- यदि उस पैकेज में
mouse
एक नाम और एक सदस्य प्रकार Button
है (जिसे तब के रूप में संदर्भित किया जा सकता है mouse.Button
), तो पूरी तरह से योग्य नाम के साथ कोई भी पैकेज नहीं हो सकता है mouse.Button
या नहीं mouse.Button.Click
।
- यदि
com.nighthacks.java.jag
किसी प्रकार का पूरी तरह से योग्य नाम है, तो कोई भी पैकेज नहीं हो सकता है जिसका पूरी तरह से योग्य नाम com.nighthacks.java.jag
या तो है com.nighthacks.java.jag.scrabble
।
हालाँकि, यह नामकरण प्रतिबंध भाषा द्वारा उप-पैकेजों को दिए जाने वाला एकमात्र महत्व है:
संकुल के लिए पदानुक्रमित नामकरण संरचना पारंपरिक तरीके से संबंधित संकुल के आयोजन के लिए सुविधाजनक है, लेकिन उस पैकेज में घोषित एक शीर्ष स्तर प्रकार के समान सरल नाम के साथ एक उप-पैकेज वाले निषेध के अलावा अपने आप में कोई महत्व नहीं है। ।
उदाहरण के लिए, नाम के एक पैकेज के बीच कोई विशेष पहुँच रिश्ता है oliver
और एक अन्य पैकेज नामित oliver.twist
, या नामित संकुल के बीच evelyn.wood
और evelyn.waugh
। अर्थात्, पैकेज में कोड नाम किसी भी अन्य पैकेज में कोड की तुलना में oliver.twist
पैकेज के भीतर घोषित प्रकारों तक बेहतर पहुंच नहीं है oliver
।
इस संदर्भ के साथ, हम स्वयं प्रश्न का उत्तर दे सकते हैं। चूंकि पैकेज और उसके उप-पैकेज के बीच या अभिभावक पैकेज के दो अलग-अलग उप-पैकेजों के बीच स्पष्ट रूप से कोई विशेष संबंध नहीं है, इसलिए अनुरोधित तरीके से दो अलग-अलग पैकेजों को दिखने वाली विधि बनाने के लिए भाषा के भीतर कोई रास्ता नहीं है। यह एक प्रलेखित, जानबूझकर डिजाइन निर्णय है।
किसी भी विधि को सार्वजनिक कर दिया जा सकता है और (सहित सभी संकुल odp.proj
और odp.proj.test
) दिया तरीकों का उपयोग करने में सक्षम हो जाएगा, या विधि पैकेज निजी (डिफ़ॉल्ट दृश्यता) बनाया जा सकता है, और सभी कोड सीधे करने के लिए की जरूरत का उपयोग है कि यह में डाल दिया जाना चाहिए विधि के रूप में एक ही (उप) पैकेज।
उस ने कहा, जावा में एक बहुत मानक अभ्यास स्रोत कोड के रूप में एक ही पैकेज में परीक्षण कोड डालना है, लेकिन फ़ाइल सिस्टम पर एक अलग स्थान पर है। उदाहरण के लिए, में Maven निर्माण उपकरण, सम्मेलन में इन स्रोत और परीक्षण फ़ाइलें डाल करने के लिए किया जाएगा src/main/java/odp/proj
और
src/test/java/odp/proj
क्रमश:। जब बिल्ड टूल इसे संकलित करता है, तो फ़ाइलों के दोनों सेट odp.proj
पैकेज में समाप्त हो जाते हैं , लेकिन केवल src
फाइलें उत्पादन की कलाकृतियों में शामिल होती हैं; उत्पादन फ़ाइलों को सत्यापित करने के लिए परीक्षण फ़ाइलों का उपयोग केवल बिल्ड समय पर किया जाता है। इस सेटअप के साथ, परीक्षण कोड स्वतंत्र रूप से किसी भी पैकेज के निजी या संरक्षित कोड का परीक्षण कर सकता है, क्योंकि वे उसी पैकेज में होंगे।
उस मामले में जहां आप सबपेकेज या सिबलिंग पैकेज में कोड शेयरिंग चाहते हैं, जो परीक्षण / उत्पादन का मामला नहीं है, एक समाधान जो मैंने देखा है कि कुछ पुस्तकालयों का उपयोग उस साझा कोड को सार्वजनिक रूप से रखना है, लेकिन यह दस्तावेज़ आंतरिक लाइब्रेरी के लिए अभिप्रेत है सिर्फ इस्तमाल करे।