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