คำตอบส่วนใหญ่ที่นี่ระบุว่าไม่มีสิ่งใดในแพคเกจย่อยใน Java แต่ไม่ถูกต้องอย่างเคร่งครัด คำนี้อยู่ในข้อกำหนดภาษาจาวากลับไปเป็นจาวา 6 และอาจจะถอยกลับไปอีก ภาษารอบแพ็กเกจย่อยไม่ได้เปลี่ยนแปลงมากนักใน JLS ตั้งแต่ Java 6
สมาชิกของแพ็กเกจเป็นแพ็กเกจย่อยและชนิดคลาสระดับบนทั้งหมดและชนิดอินเตอร์เฟสระดับบนสุดที่ประกาศในหน่วยการรวบรวมทั้งหมดของแพ็กเกจ
ตัวอย่างเช่นใน Java SE Platform API:
- แพคเกจที่
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
) จะสามารถเข้าถึงวิธีการที่กำหนดหรือวิธีการที่จะทำให้แพคเกจส่วนตัว (การมองเห็นเริ่มต้น) และรหัสทั้งหมดที่จำเป็นในการเข้าถึงโดยตรงจะต้องใส่ แพคเกจ (sub) เดียวกันกับวิธีการ
ที่กล่าวว่าการปฏิบัติมาตรฐานมากใน Java คือการวางรหัสทดสอบในแพคเกจเดียวกันกับซอร์สโค้ด แต่ในตำแหน่งอื่นในระบบไฟล์ ตัวอย่างเช่นในเครื่องมือสร้างMavenการประชุมจะต้องใส่ซอร์สและไฟล์ทดสอบเหล่านี้ในsrc/main/java/odp/proj
และ
src/test/java/odp/proj
ตามลำดับ เมื่อเครื่องมือบิลด์รวบรวมสิ่งนี้ชุดของไฟล์ทั้งสองจะอยู่ในodp.proj
แพ็คเกจ แต่มีเพียงsrc
ไฟล์เท่านั้นที่รวมอยู่ในส่วนการผลิต ไฟล์ทดสอบจะใช้ในเวลาบิลด์เพื่อตรวจสอบไฟล์ที่ใช้งานจริงเท่านั้น ด้วยการตั้งค่านี้รหัสทดสอบสามารถเข้าถึงแพคเกจส่วนตัวหรือรหัสป้องกันของรหัสที่กำลังทดสอบได้อย่างอิสระเนื่องจากจะอยู่ในแพ็คเกจเดียวกัน
ในกรณีที่คุณต้องการใช้รหัสร่วมกันในแพ็คเกจย่อยหรือแพ็คเกจพี่น้องที่ไม่ใช่กรณีทดสอบ / การผลิตโซลูชันหนึ่งที่ฉันเห็นห้องสมุดบางแห่งใช้คือการใส่รหัสที่ใช้ร่วมกันเป็นสาธารณะ แต่เอกสารที่มีไว้สำหรับไลบรารีภายใน ใช้เฉพาะ.