เนื้อหาบรรจุภัณฑ์
เนื้อหาของแพ็คเกจควรได้รับการออกแบบอย่างรอบคอบเพื่อให้พวกเขารวมคลาสและอินเทอร์เฟซที่เกี่ยวข้องตามหน้าที่เท่านั้น คลาสในแพ็คเกจสามารถเข้าถึงสมาชิกที่ไม่ได้อยู่ในรายการอื่น ๆ ของคลาสอื่น ๆ ในแพ็คเกจและบางคลาสอาจมีสิทธิ์เพียงพอในการเข้าถึงรายละเอียดภายในของคลาสอื่น ๆ เพื่อหลีกเลี่ยงชั้นเรียนดังกล่าวจากสมาชิกในชั้นเรียนที่เข้าใจผิดเราจำเป็นต้องปกป้องสมาชิกในชั้นเรียน สมาชิกใด ๆ ที่ไม่ได้ประกาศว่าเป็นส่วนตัวสามารถเข้าถึงได้โดยประเภทอื่น ๆ ทั้งหมดในแพ็คเกจเดียวกันดังนั้นคลาสที่ไม่เกี่ยวข้องใด ๆ อาจมีแนวโน้มที่จะประสานงานมากกว่าที่เราคาดหวัง
แพ็คเกจยังให้การจัดกลุ่มแบบลอจิคัลสำหรับโปรแกรมเมอร์ที่กำลังมองหาอินเทอร์เฟซและคลาสที่มีประโยชน์ แพ็คเกจที่ประกอบด้วยคลาสที่ไม่เกี่ยวข้องทำให้เป็นเรื่องยากสำหรับโปรแกรมเมอร์ที่จะบอกว่าอินเทอร์เฟซและคลาสใดที่มีประโยชน์และการจัดกลุ่มแบบตรรกะของคลาสสามารถช่วยให้โปรแกรมเมอร์นำรหัสกลับมาใช้ใหม่ได้เนื่องจากโปรแกรมเมอร์สามารถค้นหาสิ่งที่ต้องการได้ง่ายขึ้นผ่านการจัดกลุ่มแบบลอจิคัล หากแพ็คเกจมีเฉพาะชุดประเภทคู่ที่แน่นหนานั่นหมายความว่าเราสามารถให้ชื่อที่ใช้งานง่ายมากขึ้นเพื่อหลีกเลี่ยงความขัดแย้งของชื่อ
แพ็คเกจสามารถซ้อนกันได้ ตัวอย่างเช่น java.lang เป็นแพ็คเกจซ้อนกันที่แพ็คเกจ Lang ซ้อนกันในแพ็คเกจขนาดใหญ่ Java ในขณะที่แพ็คเกจ J ava ยังมีแพ็คเกจอื่น ๆ การทำรังทำให้แพ็คเกจที่เกี่ยวข้องเป็นระบบการตั้งชื่อที่มีโครงสร้างแบบลำดับชั้น
ตัวอย่างเช่นในการสร้างชุดของแพ็คเกจสำหรับระบบปรับตัวเช่นเครือข่ายประสาทและอัลกอริทึมทางพันธุกรรมเราสามารถตั้งชื่อแพ็คเกจที่มีชื่อที่คั่นด้วยจุดเพื่อสร้างแพ็คเกจซ้อนกัน:
แพ็คเกจปรับตัว ตาข่ายประสาท;
ไฟล์ต้นฉบับที่มีคำสั่งประกาศข้างต้นตั้งอยู่ในแพ็คเกจ Adaptive.NuralNet และแพ็คเกจ Adaptive.NuralNet นั้นเป็นแพ็คเกจย่อยของแพ็คเกจ Adaptive แพ็คเกจ Adaptive อาจมีบางคลาสที่เกี่ยวข้องกับอัลกอริทึมการปรับตัวทั่วไปเช่นคลาสคำสั่งปัญหาทั่วไปหรือคลาสมาตรฐาน แพ็คเกจที่อยู่ในตำแหน่งที่ลึกกว่าในลำดับชั้น (เช่น Adaptive.neu-Ralnet หรือ Adaptive.genetic) มีคลาสที่เกี่ยวข้องกับอัลกอริทึมแบบปรับตัวที่เฉพาะเจาะจง
การทำรังของแพ็คเกจเป็นเพียงเครื่องมือสำหรับการจัดระเบียบแพ็คเกจที่เกี่ยวข้องและไม่ได้ให้สิทธิ์การเข้าถึงพิเศษระหว่างแพ็คเกจ
รหัสคลาสในแพ็คเกจ Adaptive.Genetic ไม่สามารถเข้าถึงสมาชิกในแพ็คเกจ Adaptive หรือ Adaptive.NeuralNet ที่มีสิทธิ์ในการเข้าถึงแพ็คเกจและขอบเขตแพ็คเกจใช้ได้เฉพาะกับแพ็คเกจที่เฉพาะเจาะจงเท่านั้น การทำรังของแพ็คเกจสามารถจัดกลุ่มแพ็คเกจที่เกี่ยวข้องและช่วยให้โปรแกรมเมอร์ค้นหาคลาสที่ต้องการในระดับตรรกะที่สะดวกยิ่งขึ้น แต่นอกเหนือจากนั้นมันไม่ได้นำประโยชน์อื่น ๆ
หมายเหตุแพ็คเกจ
แพ็คเกจยังสามารถมีคำอธิบายประกอบได้ แต่ปัญหาคือเนื่องจากแพ็คเกจเป็นโครงสร้างขององค์กรและไม่มีเอนทิตีซอร์สโค้ดและไม่มีคำจำกัดความจริงพวกเขาไม่สามารถใส่คำอธิบายประกอบได้เช่นคลาสหรือวิธีการ ดังนั้นคำอธิบายประกอบแพ็คเกจสามารถทำได้โดยการใส่คำอธิบายประกอบคำสั่งประกาศของแพ็คเกจในไฟล์ต้นฉบับ อย่างไรก็ตามสามารถมีการประกาศแพ็คเกจเดียวในแต่ละแพ็คเกจที่สามารถมีคำอธิบายประกอบที่ดำเนินการได้
แล้วคุณจะใส่คำอธิบายประกอบแพ็คเกจอย่างไร? ในความเป็นจริง Java ไม่ได้บังคับให้โปรแกรมเมอร์ใช้วิธีการจัดการกับกฎ "คำสั่งแพ็คเกจคำอธิบายประกอบเดียว" วิธีที่แนะนำคือการสร้างไฟล์ชื่อ Package-I nfo.java ในไดเรกทอรีแพ็คเกจซึ่งมีเพียงคำสั่งแพ็คเกจและคำอธิบายประกอบของแพ็คเกจเท่านั้นที่เก็บไว้โดยไม่ต้องวางสิ่งอื่นใด ตัวอย่างเช่นไฟล์ package info.java สำหรับแพ็คเกจ attr จะเป็นแบบนี้:
@PackAgEspec (ชื่อสอง "Attt Project", version = "1.0" @Developmentsite ("attr.project.org") @DevelopmentModel ("Open-Source") แพ็คเกจ attr;Packagespec, Developments และ OpmentModel การพัฒนาใช้เพื่อปรับเปลี่ยนประเภทคำอธิบายประกอบ แน่นอนว่าพวกเขามีกลยุทธ์การออมรันไทม์ ไฟล์ package-info.java ควรรวบรวมด้วยไฟล์ต้นฉบับอื่น ๆ ในแพ็คเกจ
เราขอแนะนำให้วางข้อมูลที่เกี่ยวข้องกับแพ็คเกจทั้งหมดในไฟล์ Package-info.java หากคุณทำสิ่งนี้คุณสามารถวางความคิดเห็นของเอกสารที่จุดเริ่มต้นของไฟล์เพื่อให้เอกสารเหล่านี้มีคำอธิบายประกอบเป็นเอกสารแพ็คเกจ
วัตถุและข้อกำหนดของแพ็คเกจ
แพ็คเกจมักจะใช้ข้อกำหนดบางอย่างและมักจะมาจากองค์กร วัตถุแพ็คเกจนั้นแตกต่างจากประเภทการสะท้อนอื่น ๆ และไม่สามารถใช้ในการสร้างหรือใช้งานแพ็คเกจ แต่สามารถใช้เป็นฐานความรู้สำหรับการให้ข้อมูลซึ่งให้ข้อมูลเกี่ยวกับข้อกำหนดที่นำมาใช้โดยแพ็คเกจ (ชื่อผู้ขายและจำนวนเวอร์ชันของข้อมูลจำเพาะ) และข้อมูลเกี่ยวกับการใช้งานแพ็คเกจเอง แม้ว่าแพ็คเกจมักจะมาจากแต่ละองค์กร แต่ข้อมูลจำเพาะที่ใช้ (เช่นห้องสมุดการวิเคราะห์ทางสถิติ) อาจถูกกำหนดโดยองค์กรอื่น ๆ โปรแกรมที่ใช้แพ็คเกจอาจจำเป็นต้องรู้เวอร์ชันของข้อกำหนดที่ใช้โดยแพ็คเกจเพื่อให้สามารถใช้ฟังก์ชั่นที่กำหนดไว้ในเวอร์ชันที่แน่นอนเท่านั้น ในทำนองเดียวกันโปรแกรมเหล่านี้อาจจำเป็นต้องรู้ว่าเวอร์ชันการใช้งานใดที่มีให้กับมันซึ่งส่วนใหญ่จะจัดการกับข้อบกพร่องที่เป็นไปได้ในเวอร์ชันที่แตกต่างกัน วิธีการหลักบางอย่างของคลาสแพ็คเกจอนุญาตให้เข้าถึงข้อมูลนี้:
ตัวอย่างเช่นหากคุณดึงข้อมูลนี้ออกจากแพ็คเกจ java.lang ในระบบของเราคุณจะได้รับผลลัพธ์ต่อไปนี้: '
ข้อมูลจำเพาะชื่อ: Java Platform Specification ข้อมูลจำเพาะเวอร์ชัน: 1.4 ผู้ขายข้อมูลจำเพาะ: Sun Microsystems, Inc. การใช้งานชื่อเรื่อง: Java Runtime Environment Environment การใช้งาน: 1.5.0_02 ผู้จำหน่ายการนำไปปฏิบัติ: Sun Microsystems, Inc.
หมายเลขรุ่นที่เป็นที่ยอมรับประกอบด้วยตัวเลขที่ไม่เป็นลบคั่นด้วยตัวคั่นระยะเวลาเช่น '' 2.0 '' หรือ '11 .0.12 ' รูปแบบนี้ช่วยให้เราสามารถเรียกวิธีการ ISCompatiblewith เพื่อเปรียบเทียบหมายเลขเวอร์ชันที่ตามรูปแบบนี้ด้วยหมายเลขเวอร์ชันของแพ็คเกจ หากหมายเลขเวอร์ชันของแพ็คเกจมากกว่าหรือเท่ากับหมายเลขเวอร์ชันของตัวตายตัวแทนดังนั้นวิธีการจะกลับมาจริง การเปรียบเทียบนี้จะเปรียบเทียบจำนวนที่คั่นด้วยระยะเวลาเท่านั้น หากตัวเลขเหล่านี้มีขนาดเล็กกว่าตำแหน่งที่สอดคล้องกันในหมายเลขเวอร์ชันที่ผ่านมาทั้งสองเวอร์ชันจะไม่เข้ากัน หากหมายเลขหนึ่งในเวอร์ชันยาวกว่าอีกหมายเลขหนึ่งส่วนที่หายไปในหมายเลขเวอร์ชันสั้น ๆ จะถูกพิจารณาว่าเป็นศูนย์ ตัวอย่างเช่นหากหมายเลขรุ่นที่เป็นที่ยอมรับของแพ็คเกจคือ "1.4" และเราเปรียบเทียบกับ "1.2", "1.3.1 'หรือ" .1.81. แล้วจริงจะถูกส่งคืน; แต่ถ้าเปรียบเทียบกับ "1.4.2 '. หรือ" .5 "แล้วเท็จจะถูกส่งคืนข้อสรุปนี้ถูกวาดขึ้นเนื่องจากกลไกการเปรียบเทียบนี้ถือว่าเวอร์ชันสเปคนั้นเข้ากันได้ย้อนหลัง
ไม่มีรูปแบบที่ระบุสำหรับหมายเลขเวอร์ชันการใช้งานเนื่องจากองค์กรต่าง ๆ ที่ให้การใช้งานจะกำหนดเวอร์ชันการใช้งานที่แตกต่างกัน การเปรียบเทียบเพียงอย่างเดียวที่สามารถทำได้ระหว่างเวอร์ชันการใช้งานคือการทดสอบว่าเวอร์ชันนั้นเหมือนกันหรือไม่ซึ่งไม่มีข้อสันนิษฐานของความเข้ากันได้ย้อนหลัง
แพ็คเกจสามารถปิดผนึกซึ่งหมายความว่าไม่สามารถเพิ่มคลาสลงในแพ็คเกจได้อีกต่อไป แพ็คเกจที่ปิดผนึกสามารถมีคลาสจากหลาย ๆ ตำแหน่งในเส้นทางการค้นหาคลาสในขณะที่เนื้อหาของแพ็คเกจที่ปิดผนึกจะต้องมาจากตำแหน่งเดียวกัน - ไม่ว่าจะเป็นที่เก็บถาวรเฉพาะหรือตำแหน่งที่ระบุโดย URL มีสองวิธีในการตรวจสอบว่าแพ็คเกจถูกปิดผนึก:
.public บูลีนที่ออก P: ส่งคืน trueo หากแพ็คเกจถูกปิดผนึก
.Public Boolean ที่ออก (URL URL): ส่งคืนจริงถ้าแพ็คเกจถูกปิดผนึกสำหรับ URL ที่กำหนดนั่นคือคลาสในแพ็คเกจสามารถโหลดได้จาก URL ที่กำหนดนี้ หากคลาสในแพ็คเกจไม่สามารถโหลดได้จาก URL ที่กำหนดหรือแพ็คเกจไม่ได้ปิดผนึกแล้วเท็จจะถูกส่งคืนและข้อมูลจำเพาะและข้อมูลการใช้งานของแพ็คเกจมักจะเป็นส่วนหนึ่งของไฟล์รายการที่เก็บไว้ในแพ็คเกจ - ตัวอย่างเช่นเป็นส่วนหนึ่งของไฟล์รายการใน Java Archive (jar) ตามที่อธิบายไว้ในส่วน 25.9.2 เมื่อมีการโหลดคลาสในแพ็คเกจข้อมูลนี้จะถูกอ่านโดยบุคคล classloader สามารถกำหนดวัตถุแพ็คเกจแบบไดนามิกสำหรับคลาสที่ต้องการโหลด:
เราสามารถเรียกใช้วิธี getPackage ของวัตถุคลาสของคลาสที่กำหนดเพื่อรับวัตถุแพ็คเกจของคลาสนี้ นอกจากนี้เรายังสามารถเรียกแพ็คเกจแบบคงที่ GetPackage ด้วยชื่อแพ็คเกจที่กำหนดเพื่อรับวัตถุแพ็คเกจหรือเรียกแพ็คเกจแบบคงที่ GetPackages ซึ่งจะส่งคืนอาร์เรย์แพ็คเกจที่ประกอบด้วยแพ็คเกจทั้งหมดที่รู้จักกันในคลาสโหลด ทั้งสองวิธีเกี่ยวข้องกับตัวโหลดคลาสที่เรียกรหัสของพวกเขาเนื่องจากรหัสเหล่านี้จะเรียกวิธีการรับแพคเกจหรือ getPackages ของตัวโหลดคลาสของพวกเขา วิธีการโหลดของคลาสเหล่านี้จะค้นหาตัวโหลดคลาสที่เฉพาะเจาะจงและตัวโหลดคลาสแม่ทั้งหมดและหากไม่มีการตั้งค่าสำหรับตัวโหลดคลาสปัจจุบันตัวโหลดคลาสระบบจะถูกใช้ในเวลานี้ โปรดทราบว่าหากไม่ทราบแพ็คเกจเมธอด classloader จะส่งคืนค่า NULL เนื่องจากไม่มีการโหลดประเภทในแพ็คเกจในเวลานี้