এখানে বেশিরভাগ উত্তরে বলা হয়েছে যে জাভাতে সাবপ্যাকেজের মতো কোনও জিনিস নেই, তবে এটি কঠোরভাবে সঠিক নয়। এই শব্দটি জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে জাভা as হিসাবে অনেক পিছনে রয়েছে এবং সম্ভবত আরও পিছনে রয়েছে (জাভাটির পূর্ববর্তী সংস্করণগুলির জন্য জেএলএসের অবাধে অ্যাক্সেসযোগ্য সংস্করণ বলে মনে হয় না)। জাভা 6 এর পরে জেএলএসে সাব-প্যাকেজগুলির চারপাশের ভাষা খুব বেশি পরিবর্তন হয়নি।
প্যাকেজের সদস্যরা হ'ল এর উপ-প্যাকেজগুলি এবং প্যাকেজের সমস্ত সংকলন ইউনিটে ঘোষণা করা সমস্ত শীর্ষ স্তরের শ্রেণি এবং শীর্ষ স্তরের ইন্টারফেস প্রকারগুলি।
উদাহরণস্বরূপ, জাভা এসই প্ল্যাটফর্ম এপিআইতে:
- প্যাকেজ
javasubpackages হয়েছে 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।
যাইহোক, এই নামকরণের সীমাবদ্ধতা ভাষা দ্বারা উপ-প্যাকেজগুলিতে একমাত্র তাত্পর্যপূর্ণ:
প্যাকেজগুলির জন্য শ্রেণিবিন্যাসের নামকরণ কাঠামোটি প্রচলিত পদ্ধতিতে সম্পর্কিত প্যাকেজগুলি সংগঠিত করার জন্য সুবিধাজনক বলে মনে করা হয়, তবে সেই প্যাকেজটিতে শীর্ষ স্তরের প্রকার হিসাবে একই সরল নাম সহ একটি প্যাকেজযুক্ত প্যাকেজের বিরুদ্ধে নিষেধাজ্ঞার বাইরে অন্য কোনও তাত্পর্য নেই has ।
উদাহরণস্বরূপ, সেখানে নামে একটি প্যাকেজ মধ্যে কোন বিশেষ অ্যাক্সেস সম্পর্ক নেই oliverএবং অন্য প্যাকেজ নামে oliver.twist, বা নামে প্যাকেজ মধ্যে evelyn.woodএবং evelyn.waugh। অর্থাত্, প্যাকেজের নামযুক্ত কোডের অন্য কোনও প্যাকেজের কোডের চেয়ে oliver.twistপ্যাকেজের মধ্যে ঘোষিত ধরণেরগুলিতে এর oliverচেয়ে ভাল অ্যাক্সেস নেই ।
এই প্রসঙ্গে, আমরা নিজেই প্রশ্নের উত্তর দিতে পারি। যেহেতু প্যাকেজ এবং তার উপ-প্যাকেজের মধ্যে বা প্যারেন্ট প্যাকেজের দুটি পৃথক উপ-প্যাকেজের মধ্যে স্পষ্টভাবে কোনও বিশেষ অ্যাক্সেসের সম্পর্ক নেই, তাই অনুরোধকৃত পদ্ধতিতে দুটি পৃথক প্যাকেজের কাছে কোনও পদ্ধতি দৃশ্যমান করার জন্য ভাষার ভিতরে কোনও উপায় নেই। এটি একটি নথিভুক্ত, ইচ্ছাকৃত ডিজাইনের সিদ্ধান্ত।
হয় পদ্ধতিটি সর্বজনীন করা যেতে পারে এবং সমস্ত প্যাকেজ (সহ odp.projএবং odp.proj.test) প্রদত্ত পদ্ধতিগুলি অ্যাক্সেস করতে সক্ষম হবে, বা পদ্ধতিটি প্যাকেজটিকে ব্যক্তিগত (ডিফল্ট দৃশ্যমানতা) তৈরি করা যেতে পারে, এবং সরাসরি কোড অ্যাক্সেস করার জন্য প্রয়োজনীয় সমস্ত কোড অবশ্যই এতে রেখে দিতে হবে পদ্ধতি হিসাবে একই (উপ) প্যাকেজ।
এটি বলেছিল, জাভাতে খুব মানক অনুশীলন হ'ল উত্স কোড হিসাবে একই প্যাকেজে টেস্ট কোডটি রাখা, তবে ফাইল সিস্টেমে ভিন্ন স্থানে। উদাহরণস্বরূপ, মধ্যে ম্যাভেন বিল্ড টুল, কনভেনশন এই উৎস এবং পরীক্ষা ফাইল করা হবে src/main/java/odp/projএবং
src/test/java/odp/projযথাক্রমে। বিল্ড টুলটি যখন এটি সংকলন করে, ফাইলের দুটি সেট odp.projপ্যাকেজে শেষ হয় , তবে কেবলমাত্র srcফাইলগুলি উত্পাদন শিল্পে অন্তর্ভুক্ত থাকে; পরীক্ষার ফাইলগুলি কেবলমাত্র নির্মাণের ফাইলগুলি যাচাই করতে বিল্ড টাইমে ব্যবহৃত হয়। এই সেটআপের মাধ্যমে, পরীক্ষার কোডটি যে প্যাকেজটিকে এটি পরীক্ষা করছে তার ব্যক্তিগত বা সুরক্ষিত কোড অবাধে অ্যাক্সেস করতে পারে, কারণ তারা একই প্যাকেজে থাকবে।
যে ক্ষেত্রে আপনি সাবপ্যাকেজগুলি বা ভাইবাল প্যাকেজগুলির মধ্যে কোড ভাগ করে নেওয়া চান যা পরীক্ষা / উত্পাদনের ক্ষেত্রে নয়, এমন একটি সমাধান যা আমি কিছু লাইব্রেরি ব্যবহার করে দেখেছি তা সেই ভাগ করা কোডটিকে সর্বজনীন হিসাবে প্রকাশ করা, তবে নথিটি যা এটি অভ্যন্তরীণ লাইব্রেরির উদ্দেশ্যে করা হয়েছে শুধুমাত্র ব্যবহার.