หากเราเรียกวิธีการ getPackage บนวัตถุคลาสเราสามารถรับวัตถุแพ็คเกจที่อธิบายถึงแพ็คเกจที่คลาสอยู่ (คลาสแพ็คเกจถูกกำหนดใน java.lang) นอกจากนี้เรายังสามารถใช้ชื่อแพ็คเกจเพื่อรับวัตถุแพ็คเกจโดยเรียกวิธีการคงที่ getPackage หรือเรียกวิธีการคงที่ getPackages (ซึ่งส่งคืนอาร์เรย์ที่ประกอบด้วยแพ็คเกจที่รู้จักทั้งหมดในระบบ) วิธี getName สามารถส่งคืนชื่อเต็มของแพ็คเกจ
การใช้วัตถุแพ็คเกจนั้นแตกต่างจากประเภทการสะท้อนอื่น ๆ อย่างสิ้นเชิงเช่นเราไม่สามารถสร้างหรือจัดการแพ็คเกจที่รันไทม์ได้ เราสามารถใช้วัตถุแพ็คเกจเพื่อรับข้อมูลเกี่ยวกับแพ็คเกจเช่นวัตถุประสงค์ของแพ็คเกจที่สร้างแพ็คเกจเวอร์ชันของแพ็คเกจ ฯลฯ เราจะเลื่อนเนื้อหาเหล่านี้ออกไปจนกว่าเราจะพูดถึงรายละเอียดในภายหลัง
การตั้งชื่อแพ็คเกจ
ชื่อแพ็คเกจควรหลีกเลี่ยงความขัดแย้งกับแพ็คเกจอื่น ๆ ดังนั้นการเลือกชื่อที่มีความหมายและไม่ซ้ำกันเป็นสิ่งสำคัญในการออกแบบแพ็คเกจ อย่างไรก็ตามโปรแกรมเมอร์ทั่วโลกกำลังพัฒนาแพ็คเกจและไม่มีวิธีที่จะรู้ว่าใครใช้ชื่อแพ็คเกจใดดังนั้นการเลือกชื่อแพ็คเกจเดียวคือปัญหา หากเราพิจารณาว่าแพ็คเกจใช้เฉพาะภายในองค์กรของเราเราสามารถมีผู้ตัดสินภายในเพื่อให้แน่ใจว่าไม่มีชื่อขัดแย้งระหว่างโครงการ
แต่สำหรับโลกทั้งโลกวิธีนี้ไม่ได้ใช้งานได้จริง ตัวระบุแพ็คเกจเป็นชื่อง่าย ๆ และเป็นวิธีที่ดีกว่าเพื่อให้แน่ใจว่าชื่อแพ็คเกจคือการใช้ชื่อโดเมนอินเทอร์เน็ต หาก บริษัท ที่เราทำงานอยู่คือ Magic.lnc และชื่อโดเมนของ บริษัท คือ Magic C.com ดังนั้นการประกาศแพ็คเกจแอตทริบิวต์ควรเป็น:
แพ็คเกจ com.magic.attr;
โปรดทราบว่าชื่อโดเมนองค์ประกอบส่วนประกอบที่นี่ถูกจัดเรียงตามลำดับย้อนกลับของชื่อโดเมนทั่วไป
หากเราใช้สำนวนนี้ชื่อแพ็คเกจที่เราใช้จะไม่ขัดแย้งกับคนอื่นยกเว้นความขัดแย้งที่เป็นไปได้ภายในองค์กรของเรา หากมีความขัดแย้งภายในองค์กรของเรา (อาจเป็นองค์กรขนาดใหญ่) เราสามารถใช้ชื่อโดเมนที่เฉพาะเจาะจงมากขึ้นเพื่อให้มีคุณสมบัติเพิ่มเติม บริษัท ขนาดใหญ่หลายแห่งมีโดเมนย่อยภายในเช่นตะวันออกและยุโรปซึ่งสามารถนำมาใช้เพื่อให้มีคุณสมบัติเพิ่มเติมชื่อของแพ็คเกจ:
แพ็คเกจข้าวโพด. magic.japan.attr;
การใช้โซลูชันนี้อาจทำให้ชื่อแพ็คเกจยาวมาก แต่ค่อนข้างปลอดภัย โปรแกรมเมอร์ที่ใช้เทคนิคนี้จะไม่เลือกชื่อแพ็คเกจเดียวกันและโปรแกรมเมอร์ที่ไม่ใช้เทคนิคนี้จะไม่เลือกชื่อที่เราใช้
เนื้อหาบรรจุภัณฑ์
เนื้อหาของแพ็คเกจควรได้รับการออกแบบอย่างรอบคอบเพื่อให้พวกเขารวมคลาสและอินเทอร์เฟซที่เกี่ยวข้องตามหน้าที่เท่านั้น คลาสในแพ็คเกจสามารถเข้าถึงสมาชิกที่ไม่ได้อยู่ในรายการอื่น ๆ ของคลาสอื่น ๆ ในแพ็คเกจและบางคลาสอาจมีสิทธิ์เพียงพอในการเข้าถึงรายละเอียดภายในของคลาสอื่น ๆ เพื่อหลีกเลี่ยงชั้นเรียนดังกล่าวจากสมาชิกในชั้นเรียนที่เข้าใจผิดเราจำเป็นต้องปกป้องสมาชิกในชั้นเรียน สมาชิกใด ๆ ที่ไม่ได้ประกาศว่าเป็นส่วนตัวสามารถเข้าถึงได้โดยประเภทอื่น ๆ ทั้งหมดในแพ็คเกจเดียวกันดังนั้นคลาสที่ไม่เกี่ยวข้องใด ๆ อาจมีแนวโน้มที่จะประสานงานมากกว่าที่เราคาดหวัง
แพ็คเกจยังให้การจัดกลุ่มแบบลอจิคัลสำหรับโปรแกรมเมอร์ที่กำลังมองหาอินเทอร์เฟซและคลาสที่มีประโยชน์ แพ็คเกจที่ประกอบด้วยคลาสที่ไม่เกี่ยวข้องทำให้เป็นเรื่องยากสำหรับโปรแกรมเมอร์ที่จะบอกว่าอินเทอร์เฟซและคลาสใดที่มีประโยชน์และการจัดกลุ่มแบบตรรกะของคลาสสามารถช่วยให้โปรแกรมเมอร์นำรหัสกลับมาใช้ใหม่ได้เนื่องจากโปรแกรมเมอร์สามารถค้นหาสิ่งที่ต้องการได้ง่ายขึ้นผ่านการจัดกลุ่มแบบลอจิคัล หากแพ็คเกจมีเฉพาะชุดประเภทคู่ที่แน่นหนานั่นหมายความว่าเราสามารถให้ชื่อที่ใช้งานง่ายมากขึ้นเพื่อหลีกเลี่ยงความขัดแย้งของชื่อ
แพ็คเกจสามารถซ้อนกันได้ ตัวอย่างเช่น 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 หากคุณทำสิ่งนี้คุณสามารถวางความคิดเห็นของเอกสารที่จุดเริ่มต้นของไฟล์เพื่อให้เอกสารเหล่านี้มีคำอธิบายประกอบเป็นเอกสารแพ็คเกจ
การเข้าถึงแพ็คเกจ
เมื่อประกาศการเข้าถึงคลาสระดับบนสุดและอินเทอร์เฟซระดับบนสุดในแพ็คเกจมีสองตัวเลือก: การเข้าถึงแพ็คเกจ (แพ็คเกจ) และการเข้าถึงสาธารณะ (สาธารณะ) คลาสหรืออินเทอร์เฟซที่แก้ไขด้วยสาธารณะสามารถเข้าถึงได้ด้วยรหัสนอกแพคเกจในขณะที่ประเภทที่ไม่ได้ตกแต่งด้วยสาธารณะมีขอบเขตแพ็คเกจ: สามารถเข้าถึงได้ด้วยรหัสอื่น ๆ ในแพ็คเกจเดียวกัน แต่พวกเขาถูกซ่อนไว้สำหรับรหัสนอกแพคเกจแม้ในรหัสแพคเกจย่อย เมื่อประกาศประเภทเราควรประกาศประเภทเหล่านั้นที่โปรแกรมเมอร์อื่น ๆ จำเป็นต้องใช้เป็นสาธารณะและซ่อนประเภทเหล่านั้นที่เป็นของรายละเอียดการใช้งานของแพ็คเกจ เทคโนโลยีนี้ช่วยให้เรามีความยืดหยุ่นอย่างมากและเนื่องจากโปรแกรมเมอร์ไม่พึ่งพารายละเอียดการใช้งานประเภทนี้ที่พวกเขาไม่สามารถเข้าถึงได้เราจึงสามารถเปลี่ยนแปลงได้อย่างอิสระเมื่อเราต้องการเปลี่ยนรายละเอียดการใช้งาน
สมาชิกชั้นเรียนที่ไม่ได้ประกาศว่าเป็นสาธารณะการป้องกันหรือส่วนตัวสามารถเข้าถึงได้โดยตรงด้วยรหัสใด ๆ ภายในแพ็คเกจ แต่ถูกซ่อนจากนอกแพ็คเกจ กล่าวอีกนัยหนึ่งตัวปรับเปลี่ยนการเข้าถึงเริ่มต้นคือ "แพ็คเกจ" ยกเว้นสมาชิกของอินเทอร์เฟซและตัวปรับเปลี่ยนการเข้าถึงเริ่มต้นของพวกเขาคือ "สาธารณะ"
ฟิลด์หรือวิธีการที่ไม่ได้ประกาศส่วนตัวภายในแพ็คเกจสามารถเข้าถึงได้โดยรหัสอื่น ๆ ทั้งหมดในแพ็คเกจนั้นดังนั้นคลาสในแพ็คเกจเดียวกันจึงถือว่าเป็น "มิตร" หรือ "เชื่อถือได้" สิ่งนี้ช่วยให้เราสามารถกำหนดเฟรมเวิร์กแอปพลิเคชันที่รวมรหัสที่กำหนดไว้ล่วงหน้าและรหัสตัวยึดตำแหน่งซึ่งรหัสตัวยึดตำแหน่งถูกแทนที่ด้วยคลาสย่อยของคลาสเฟรมเวิร์ก รหัสที่กำหนดไว้ล่วงหน้าสามารถใช้ตัวดัดแปลงการเข้าถึงแพ็คเกจเพื่อให้รหัสการทำงานร่วมกันอื่น ๆ ภายในแพ็คเกจสามารถเข้าถึงได้โดยตรง แต่สำหรับผู้ใช้นอกแพคเกจรหัสเหล่านี้ไม่สามารถเข้าถึงได้ อย่างไรก็ตามแพ็คเกจย่อยของแพ็คเกจที่รหัสเหล่านี้ไม่น่าเชื่อถือและในทางกลับกัน ตัวอย่างเช่นรหัสที่แก้ไขด้วยตัวดัดแปลงการเข้าถึงแพ็คเกจในแพ็คเกจ DIT ไม่สามารถเข้าถึงได้ด้วยรหัสในแพ็คเกจลูก dit.dat และในทางกลับกัน
ดังนั้นแต่ละประเภทกำหนดสามสัญญาที่แตกต่างกัน:
.publi. สัญญา: กำหนดฟังก์ชั่นหลักของประเภท
. สัญญาที่ได้รับการปกป้อง: กำหนดฟังก์ชั่นที่มีให้กับคลาสย่อยเพื่อวัตถุประสงค์เฉพาะ
. แพคเกจสัญญา: กำหนดฟังก์ชั่นที่สามารถรับได้โดยรหัสอื่นในแพ็คเกจเพื่อให้ได้ความร่วมมือระหว่างประเภทในแพ็คเกจ สัญญาทั้งหมดเหล่านี้จำเป็นต้องมีการพิจารณาและออกแบบอย่างรอบคอบ
วิธีการเข้าถึงและความคุ้มครอง
เฉพาะวิธีที่สามารถเข้าถึงได้ใน superclasses สามารถเขียนทับในคลาสย่อย หากวิธีการใน superclass ไม่สามารถเข้าถึงได้วิธีการไม่สามารถแทนที่ใน subclass ได้แม้ว่าวิธีการในคลาสย่อยจะมีชื่อเดียวกับวิธีการ เมื่อมีการเรียกวิธีการที่รันไทม์ระบบจะพิจารณาการเข้าถึงและกำหนดว่าการใช้งานของมันกำลังทำงานอยู่
ตัวอย่างที่สร้างขึ้นเป็นพิเศษต่อไปนี้อธิบายได้ชัดเจนยิ่งขึ้น สมมติว่าเราประกาศคลาสนามธรรมในแพ็คเกจ P1:
แพ็คเกจ P1; {AB AB ABAB Public Abstract Class AbstractBase Private Void PRI () {print ("stractbase.pri ()"):} void pac () {print ("stractbase.pac ()"); } Void Pro () {print ("stractbase.pro ()"); } Public Void Pub () {print ("stractbase.pub ()");} โมฆะสุดท้ายสาธารณะแสดง () pri (); pac (); Pro (); ผับ(); -ในชั้นเรียนนี้เรากำหนด 4 วิธีแต่ละวิธีมีตัวดัดแปลงการเข้าถึงที่แตกต่างกันและร่างกายของวิธีการระบุตัวเองเท่านั้น วิธีการแสดงเรียกวิธี 4 วิธีเหล่านี้ในวัตถุปัจจุบันในทางกลับกัน เมื่อใช้วิธีนี้กับวัตถุย่อยที่แตกต่างกันสามารถอธิบายได้ว่าการใช้วิธีการเหล่านี้เรียกว่า
ตอนนี้เรากำหนดคอนกรีตคลาสซึ่งขยายคลาส AbstractBase แต่อยู่ในแพ็คเกจ P2:
แพ็คเกจ P2; นำเข้า P1.ABSTRACTBASE คลาสสาธารณะ Concretel ขยาย AbstractBase {โมฆะสาธารณะ pri () {print ("concretel.pri ()");} โมฆะสาธารณะ pac () {print ("concretel.pac ()"); pub () {print ("concretel.pub ()");}}วิธีการทั้ง 4 ใน superclass จะถูก redeclared ในชั้นเรียนนี้และการใช้งานของพวกเขามีการเปลี่ยนแปลงซึ่งกำลังรายงานว่าพวกเขาอยู่ในคลาส con-cretel ในเวลาเดียวกันสิทธิ์การเข้าถึงของพวกเขาได้ถูกเปลี่ยนเป็นสาธารณะเพื่อให้รหัสอื่น ๆ เพื่อเข้าถึง เรียกใช้รหัสต่อไปนี้
คอนกรีตใหม่ (). show ():
เอาต์พุตต่อไปนี้จะถูกสร้างขึ้น:
AbstractBase.pri () AbstractBase.pac () Concretel.pro () Concretel.pub ()
เนื่องจากวิธีการส่วนตัว PRI ไม่สามารถเข้าถึงได้โดย subclasses (หรือคลาสอื่น ๆ ) วิธีการแสดงจึงเรียกใช้วิธีการ PRI ในคลาส AbstractBase วิธี PAC ที่มีสิทธิ์การเข้าถึงแพ็คเกจในคลาส AbstractBase ไม่สามารถเข้าถึงได้โดย Concretel ดังนั้นการใช้วิธี PAC ในคลาส Concretel ไม่สามารถแทนที่คำจำกัดความในคลาส AbstractBase ดังนั้นวิธีการแสดงจึงเรียกวิธี AbstractBase.pac วิธี Pro และวิธีการผับสามารถเข้าถึงได้ในคลาสคอนกรีตและยังสามารถเขียนทับได้ดังนั้นวิธีการแสดงจึงเรียกใช้การใช้วิธีการทั้งสองนี้ในคลาสคอนกรีต
ทำตามความหมายเท้าของเราคลาสคอนกรีต 2 เพื่อขยายคอนกรีตคลาสจากนั้นเราวางไว้ในแพ็คเกจเดียวกัน p1 เช่นเดียวกับคลาสนามธรรมเบส ':
แพ็คเกจ P1; นำเข้า P2.Concretel คลาสสาธารณะคอนกรีต 2 ขยาย concretel {โมฆะสาธารณะ pri () {print ("concrete2.pri ()");} โมฆะสาธารณะ pac () {print ("concrete2.pac ()"); Pub () {print ("Concrete2.pub ()");}}เนื่องจากวิธีการในคอนกรีตมีสิทธิ์ในการเข้าถึงสาธารณะจึงสามารถเข้าถึงได้ในคอนกรีต 2 และแต่ละวิธีในคอนกรีต 2 ครอบคลุมวิธีการที่สอดคล้องกันแยกกัน นอกจากนี้เนื่องจากคอนกรีต 2 และ AbstractBase อยู่ในแพ็คเกจเดียวกันวิธี AbstractBase.pac สามารถเข้าถึงได้ในคอนกรีต 2 และวิธีการคอนกรีต 2.PAC สามารถถูกแทนที่ได้ เรียกวิธีการแสดงบนวัตถุคอนกรีต 2 และผลการพิมพ์มีดังนี้:
AbstractBase.pri () Concrete2.pac () คอนกรีต 2.Pro () คอนกรีต 2.pub ()
ในที่สุดเรากำหนดคลาสคอนกรีต 3 เพื่อขยายคลาสคอนกรีต 2 และวางไว้ในแพ็คเกจ P3:
แพ็คเกจ P3 นำเข้า P1.Concrete2; คลาสสาธารณะคอนกรีต 3 ขยายคอนกรีต 2 {โมฆะสาธารณะ pri () {print ("คอนกรีต3.pri ()");} โมฆะสาธารณะ pac q {พิมพ์ ("คอนกรีต 3.pac ()");} โมฆะสาธารณะ pro () {print ("concrete3.pro ()");เรียกวิธีการแสดงบนวัตถุคอนกรีต 3 และผลการพิมพ์มีดังนี้:
AbstractBase.PRI () คอนกรีต 3.PAC () คอนกรีต 3.PRO () คอนกรีต 3.PUB ()
วิธีการคอนกรีต 3.PAC ดูเหมือนว่าจะแทนที่วิธี AbstractBase.pac ที่ไม่สามารถเข้าถึงได้ แต่ในความเป็นจริงวิธีคอนกรีต 3.PAC แทนที่วิธีคอนกรีต 2.PAC และวิธีการคอนกรีต 2.PAC แทนที่วิธี AbstractBase.pac โดยการเพิ่มวิธี PAC ในคลาสคอนกรีต 2 ว่ามีสิทธิ์การเข้าถึงสาธารณะสามารถเข้าถึงและเขียนทับโดยคลาสย่อยใด ๆ
วัตถุและข้อกำหนดของแพ็คเกจ
แพ็คเกจมักจะใช้ข้อกำหนดบางอย่างและมักจะมาจากองค์กร วัตถุแพ็คเกจนั้นแตกต่างจากประเภทการสะท้อนอื่น ๆ และไม่สามารถใช้ในการสร้างหรือใช้งานแพ็คเกจ แต่สามารถใช้เป็นฐานความรู้สำหรับการให้ข้อมูลซึ่งให้ข้อมูลเกี่ยวกับข้อกำหนดที่ใช้โดยแพ็คเกจ (ชื่อผู้ขายและหมายเลขเวอร์ชัน) และข้อมูลเกี่ยวกับการใช้งานแพ็คเกจเอง แม้ว่าแพ็คเกจมักจะมาจากแต่ละองค์กร แต่ข้อมูลจำเพาะที่ใช้ (เช่นห้องสมุดการวิเคราะห์ทางสถิติ) อาจถูกกำหนดโดยองค์กรอื่น ๆ โปรแกรมที่ใช้แพ็คเกจอาจจำเป็นต้องรู้เวอร์ชันของข้อกำหนดที่ใช้โดยแพ็คเกจเพื่อให้สามารถใช้ฟังก์ชั่นที่กำหนดไว้ในเวอร์ชันที่แน่นอนเท่านั้น ในทำนองเดียวกันโปรแกรมเหล่านี้อาจจำเป็นต้องรู้ว่าเวอร์ชันการใช้งานใดที่มีให้กับมันซึ่งส่วนใหญ่จะจัดการกับข้อบกพร่องที่เป็นไปได้ในเวอร์ชันที่แตกต่างกัน วิธีการหลักบางอย่างของคลาสแพ็คเกจอนุญาตให้เข้าถึงข้อมูลนี้:
・ สาธารณะ stri ng getName (): ส่งคืนชื่อของแพ็คเกจ
.Public String GetSpecificationTitle P: ส่งคืนชื่อของข้อมูลจำเพาะที่ดำเนินการโดยแพ็คเกจ หากไม่ทราบชื่อให้ส่งคืนค่า null
.Public String getSpecificationVersion (): ส่งคืนสตริงที่อธิบายข้อมูลเวอร์ชันของข้อกำหนดที่ใช้โดยแพ็คเกจ หากไม่ทราบข้อมูลเวอร์ชันให้ส่งคืนค่า null
.Public String GetSpecificationVendor Q: ส่งคืนชื่อของซัพพลายเออร์ซึ่งเป็นเจ้าของและรักษาข้อกำหนดที่ใช้โดยแพ็คเกจ หากไม่ทราบซัพพลายเออร์ให้ส่งคืนค่า NULL
.Public String GetImplerentationTitle (): ส่งคืนชื่อของการใช้งานที่จัดทำโดยแพ็คเกจ หากไม่ทราบชื่อเรื่องจะส่งคืนค่า NULL, ・ Public String GetInmplementationVersion (): ส่งคืนสตริงที่อธิบายข้อมูลเวอร์ชันของการใช้งานที่จัดทำโดยแพ็คเกจ หากไม่ทราบข้อมูลเวอร์ชันจะส่งคืน NULL
・ Public String GetInmplementationVendor (): ส่งคืนชื่อขององค์กร (ผู้ขาย) ที่ให้การดำเนินการ หากไม่ทราบองค์กรให้ส่งคืนค่า NULL
ตัวอย่างเช่นหากเราดึงข้อมูลเหล่านี้ออกจากแพ็คเกจ 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 สามารถกำหนดวัตถุแพ็คเกจแบบไดนามิกสำหรับคลาสที่ต้องการโหลด:
. การป้องกันแพ็คเกจ DENEPACKAGE (ชื่อสตริง, Spectitle สตริง, สเปคเวิร์นสตริง, สเป็คเวนเดอร์สตริง, สตริง imptitle, สตริง implversion, string implVendor, URL sealbase): วิธีนี้จะส่งคืนวัตถุแพ็คเกจที่มีชื่อแพ็คเกจและข้อกำหนดและข้อกำหนดการใช้งานที่กำหนด หากพารามิเตอร์ sealbase เป็นโมฆะแพ็คเกจจะไม่ปิดผนึกมิฉะนั้นแพ็คเกจจะถูกปิดผนึกสำหรับ URL นี้: วัตถุแพ็คเกจของคลาสจะต้องกำหนดก่อนที่คลาสจะถูกกำหนดและชื่อแพ็คเกจจะต้องไม่ซ้ำกันในคลาสโหลดเดอร์ หากชื่อแพ็คเกจซ้ำด้วยชื่อที่มีอยู่งาน 11EGA1ARGumentException จะถูกโยนลงไป
เราสามารถเรียกใช้วิธี getPackage ของวัตถุคลาสของคลาสที่กำหนดเพื่อรับวัตถุแพ็คเกจของคลาสนี้ นอกจากนี้เรายังสามารถเรียกแพ็คเกจแบบคงที่ GetPackage ด้วยชื่อแพ็คเกจที่กำหนดเพื่อรับวัตถุแพ็คเกจหรือเรียกแพ็คเกจแบบคงที่ GetPackages ซึ่งจะส่งคืนอาร์เรย์แพ็คเกจที่ประกอบด้วยแพ็คเกจทั้งหมดที่รู้จักกันในคลาสโหลด ทั้งสองวิธีเกี่ยวข้องกับตัวโหลดคลาสที่เรียกรหัสของพวกเขาเนื่องจากรหัสเหล่านี้จะเรียกวิธีการรับแพคเกจหรือ getPackages ของตัวโหลดคลาสของพวกเขา วิธีการโหลดของคลาสเหล่านี้จะค้นหาตัวโหลดคลาสที่เฉพาะเจาะจงและตัวโหลดคลาสแม่ทั้งหมดและหากไม่มีการตั้งค่าสำหรับตัวโหลดคลาสปัจจุบันตัวโหลดคลาสระบบจะถูกใช้ในเวลานี้ โปรดทราบว่าหากไม่ทราบแพ็คเกจเมธอด classloader จะส่งคืนค่า NULL เนื่องจากไม่มีการโหลดประเภทในแพ็คเกจในเวลานี้