รายการพารามิเตอร์ตัวแปร Java
การคัดลอกรหัสมีดังนี้:
คลาส A {}
เนื่องจากคลาสทั้งหมดได้รับการสืบทอดมาจากวัตถุคุณสามารถใช้อาร์เรย์วัตถุเป็นพารามิเตอร์:
พารามิเตอร์ระดับสาธารณะ {โมฆะคงที่ printArray (Object [] args) {สำหรับ (Object obj: args) {system.out.print (obj + ""); } system.out.println (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {printArray (วัตถุใหม่ [] {ใหม่จำนวนเต็ม (47), โฟลตใหม่ (3.14), คู่ใหม่ (11.11)}); printArray (วัตถุใหม่ [] {"หนึ่ง", "สอง", "มี"}); printArray (วัตถุใหม่ [] {ใหม่ a (), ใหม่ a (), ใหม่ a ()}); - สำหรับรุ่น Java SE5 หลังจากเพิ่มคุณสมบัติคุณสามารถเขียนสิ่งนี้:
พารามิเตอร์ระดับสาธารณะ {โมฆะคงที่สาธารณะ printArray (วัตถุ ... args) {สำหรับ (Object obj: args) {system.out.print (obj + ""); } system.out.println (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {printArray (จำนวนเต็มใหม่ (47), โฟลตใหม่ (3.14), คู่ใหม่ (11.11)); PrintArray (47, 3.14F, 11.11); PrintArray ("One", "Two", "Three"); PrintArray (ใหม่ A (), ใหม่ A (), ใหม่ A ()); printArray ((วัตถุ []) จำนวนเต็มใหม่ [] {1, 2, 3, 4}); printArray (); - คุณสามารถใช้วัตถุเพื่อคิดถึงรายการพารามิเตอร์:
คลาสสาธารณะ varargtype {โมฆะคงที่ f (อักขระ ... args) {system.out.print (args.getClass ()); System.out.println ("ความยาว" + args.length); } โมฆะคงที่ g (int ... args) {system.out.print (args.getClass ()); System.out.println ("ความยาว" + args.length); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {f ('a'); f (); g (1); g (); System.out.println ("int []" + int ใหม่ [0] .getClass ()); -นี่เป็นคุณสมบัติที่แนะนำใน Java 5 หากจำนวนพารามิเตอร์ที่วิธีการต้องการรับไม่แน่นอนคุณลักษณะนี้จะมีประโยชน์
ตัวอย่างเช่นที่เกี่ยวข้องกับการดำเนินการของ IO คุณจำเป็นต้องปิดสตรีมอย่างน้อยสองอย่าง: อินพุตและเอาต์พุต ฉันชอบที่จะห่อหุ้มการดำเนินการปิดสตรีมลงในวิธีการต่อไปนี้เพื่อให้สามารถปิดสตรีมหลายสายในการโทรเพียงครั้งเดียว
โมฆะคงที่สาธารณะปิด (ปิดได้ ... ปิด) {สำหรับ (ปิดได้ (ปิดได้: closeables) {ถ้า (ปิดได้! = null) {ลอง {classable.close (); } catch (iOexception ถูกละเว้น) {}}}}ที่นี่เป็นสถานที่เดียวที่ฉันคิดว่าคุณสมบัตินี้เหมาะสำหรับการใช้งานด้วยคุณสมบัติดังต่อไปนี้:
พารามิเตอร์เหล่านี้มีประเภทเดียวกัน
จำนวนพารามิเตอร์ไม่แน่นอนแต่ละตัวเลือก;
การใช้พารามิเตอร์เหล่านี้เหมือนกันตัวอย่างเช่นข้างต้นคือการปิดการดำเนินการทั้งหมด
รายการพารามิเตอร์ความยาวตัวแปร Java สามารถวางไว้ที่ส่วนท้ายของรายการพารามิเตอร์เมธอดเท่านั้น
การใช้งานรายการพารามิเตอร์ความยาวตัวแปร Java
การใช้งานรายการพารามิเตอร์ความยาวตัวแปร Java จะถูกส่งผ่านคอมไพเลอร์เพื่อห่อหุ้มพารามิเตอร์เหล่านี้ลงในอาร์เรย์
ตัวอย่างเช่นลายเซ็นของวิธีการข้างต้นเป็นจริง: ปิด (ปิด [] closeables) เป็นโมฆะ
ก้าวไปบนหลุม
มีวิธีการที่เรียกโดย A และ B ในสองแห่ง ในเดือนกันยายนจำเป็นต้องเพิ่มพารามิเตอร์ลงใน A. เมื่อใจของฉันบ้าฉันตัดสินใจที่จะใช้รายการพารามิเตอร์ความยาวตัวแปร ฉันรู้สึกว่าไม่จำเป็นต้องเปลี่ยนเป็น B ดังนั้นหลุมจึงถูกฝัง
เมื่อเร็ว ๆ นี้เราได้ขอให้ B เพิ่มพารามิเตอร์ใหม่สองตัวที่นี่ดังนั้นเราจึงยังคงเพิ่มพารามิเตอร์ในรายการพารามิเตอร์ของเมธอดต่อไป ประเภทของพารามิเตอร์เหล่านี้แตกต่างกันดังนั้นรายการพารามิเตอร์ความยาวตัวแปรจะถูกประกาศเป็นประเภทวัตถุ
หลุมแรกคือเมื่อใช้องค์ประกอบที่มีพารามิเตอร์ความยาวตัวแปรในวิธีนี้มันไม่ได้คำนึงถึงว่าพารามิเตอร์บางตัวไม่ผ่านและอาเรย์เป็นข้อยกเว้นที่ล้ำหน้าถูกทำลายโดยตรง ฉันรู้สึกทันทีว่ารายการพารามิเตอร์ความยาวตัวแปรไม่ดีดังนั้นฉันจึงไม่ต้องการมันและเปลี่ยนเป็นพารามิเตอร์รูปแบบคงที่ปกติที่ผ่าน
หลังจากการดัดแปลงมันเป็นการดีที่จะทดสอบในสภาพแวดล้อมการทดสอบ หลังจากแทนที่หลายคลาสในสภาพแวดล้อมการผลิตผลลัพธ์คือข้อผิดพลาด ไม่พบวิธีการ ขึ้นอยู่กับลายเซ็นวิธีการ แต่เป็นอาร์เรย์และยังไม่ได้ถูกแทนที่ ตัดสินจากซอร์สโค้ดตำแหน่งการโทรไม่จำเป็นต้องเปลี่ยนแปลงดังนั้นฉันไม่คาดหวังว่าจะแทนที่ เนื่องจากสภาพแวดล้อมการทดสอบได้รับการบรรจุอย่างเต็มที่จึงไม่มีปัญหา
ลายเซ็นของวิธีการถูกกำหนดในเวลาที่รวบรวม ระดับซอร์สโค้ดดูเหมือนจะไม่จำเป็นต้องมีการแก้ไข แต่ไม่ได้หมายความว่าคลาสคอมไพล์ไม่จำเป็นต้องเปลี่ยน
ในความเป็นจริงฉันเคยได้ยินมาก่อนว่าในกรณีของแพ็คเกจที่ผิดปกตินี้หลังจากเปลี่ยนค่าคงที่ในซอร์สโค้ดเฉพาะไฟล์คลาสที่กำหนดค่าคงที่จะถูกแทนที่และไม่มีการคอมไพล์ใหม่และแทนที่ไฟล์คลาสทั้งหมดที่อ้างอิงค่าคงที่นี้เป็นไปได้ มันเป็นปัญหาเดียวกันกับการลายเซ็นของวิธีการ