นับตั้งแต่การเปิดตัวคำอธิบายประกอบในเวอร์ชัน Java 5.0 มันได้กลายเป็นส่วนสำคัญของแพลตฟอร์ม Java ในระหว่างกระบวนการพัฒนาเรามักจะเห็นคำอธิบายประกอบเช่น @Override และ @deprecated ในรหัสแอปพลิเคชัน ในบทความนี้ฉันจะบอกคุณว่าคำอธิบายประกอบคืออะไรทำไมพวกเขาควรได้รับการแนะนำว่าคำอธิบายประกอบทำงานอย่างไรวิธีการเขียนคำอธิบายประกอบที่กำหนดเอง (ผ่านตัวอย่าง) และภายใต้สถานการณ์ใดที่คุณสามารถใช้คำอธิบายประกอบได้เช่นเดียวกับคำอธิบายประกอบล่าสุดและ ADF (กรอบการพัฒนาแอปพลิเคชัน) มันจะใช้เวลาเล็กน้อยดังนั้นเตรียมกาแฟสักถ้วยและให้เราเข้าสู่โลกแห่งคำอธิบายประกอบ
คำอธิบายประกอบคืออะไร?
คำเดียวสามารถอธิบายคำอธิบายประกอบได้นั่นคือข้อมูลเมตานั่นคือข้อมูลที่อธิบายข้อมูล ดังนั้นจึงอาจกล่าวได้ว่าคำอธิบายประกอบเป็นข้อมูลเมตาของซอร์สโค้ด ตัวอย่างเช่นรหัสต่อไปนี้:
@Overridepublic String ToString () {return "นี่คือการแสดงสตริงของวัตถุปัจจุบัน";}ในรหัสข้างต้นฉันเขียนวิธี TOSTRING () ใหม่และใช้คำอธิบายประกอบ @Override อย่างไรก็ตามแม้ว่าฉันจะไม่ใช้คำอธิบายประกอบ @Override เพื่อทำเครื่องหมายรหัสโปรแกรมสามารถดำเนินการตามปกติ ดังนั้นคำอธิบายประกอบหมายถึงอะไร? มีประโยชน์ในการเขียนด้วยวิธีนี้หรือไม่? ในความเป็นจริง @Override บอกคอมไพเลอร์ว่าวิธีนี้เป็นวิธีการเขียนใหม่ (ข้อมูลเมตาอธิบายวิธีการ) หากวิธีการไม่มีอยู่ในคลาสพาเรนต์คอมไพเลอร์จะรายงานข้อผิดพลาดโดยแจ้งว่าวิธีนี้ไม่ได้เขียนวิธีการในคลาสพาเรนต์ใหม่ ถ้าฉันตั้งใจสะกดผิดผิดพลาดตัวอย่างเช่นเขียน toString () เป็น toString () {double r} และฉันไม่ได้ใช้คำอธิบายประกอบ @Override โปรแกรมยังสามารถรวบรวมและเรียกใช้ได้ แต่ผลลัพธ์ของการดำเนินการจะแตกต่างจากที่ฉันคาดไว้มาก ตอนนี้เราเข้าใจว่าคำอธิบายประกอบคืออะไรและการใช้คำอธิบายประกอบช่วยอ่านโปรแกรม
คำอธิบายประกอบเป็นตัวดัดแปลงพิเศษที่ใช้กับคลาสวิธีการพารามิเตอร์ตัวแปรตัวสร้างและการประกาศแพ็คเกจ มันเป็นเครื่องมือที่เลือกโดยมาตรฐาน JSR-175 เพื่ออธิบายข้อมูลเมตา
ทำไมต้องแนะนำคำอธิบายประกอบ?
ก่อน (หรือแม้กระทั่งหลังการใช้งาน) XML ใช้กันอย่างแพร่หลายเพื่ออธิบายข้อมูลเมตา นักพัฒนาแอปพลิเคชันและสถาปนิกบางคนเริ่มพบว่าการบำรุงรักษา XML นั้นแย่ลงเรื่อย ๆ พวกเขาต้องการใช้บางสิ่งบางอย่างอย่างแน่นหนากับรหัสแทนที่จะเป็นคำอธิบายรหัสที่เชื่อมโยงกับรหัสอย่างหลวม ๆ (และในบางกรณีก็แยกจากกันอย่างสมบูรณ์) เช่น XML หากคุณค้นหา "XML vs. Annotations" ใน Google คุณจะเห็นการอภิปรายมากมายเกี่ยวกับปัญหานี้ สิ่งที่น่าสนใจที่สุดคือการกำหนดค่า XML ได้รับการแนะนำให้รู้จักกับรหัสและการกำหนดค่าแยกต่างหาก สองมุมมองข้างต้นอาจทำให้คุณสับสน มุมมองทั้งสองดูเหมือนจะก่อให้เกิดวัฏจักร แต่แต่ละคนมีข้อดีและข้อเสีย มาใช้ตัวอย่างเพื่อทำความเข้าใจความแตกต่างระหว่างทั้งสอง
หากคุณต้องการตั้งค่าคงที่หรือพารามิเตอร์จำนวนมากสำหรับแอปพลิเคชันของคุณ XML เป็นตัวเลือกที่ดีในกรณีนี้เพราะจะไม่เชื่อมต่อกับรหัสเฉพาะ หากคุณต้องการประกาศวิธีการเป็นบริการมันจะเป็นการดีกว่าที่จะใช้คำอธิบายประกอบเพราะในกรณีนี้คำอธิบายประกอบและวิธีการจะต้องเข้ากันอย่างแน่นหนาและนักพัฒนาต้องรับรู้สิ่งนี้
ปัจจัยสำคัญอีกประการหนึ่งคือคำอธิบายประกอบกำหนดวิธีมาตรฐานในการอธิบายข้อมูลเมตา ก่อนหน้านี้นักพัฒนามักจะกำหนดข้อมูลเมตาในแบบของตนเอง ตัวอย่างเช่นใช้อินเทอร์เฟซที่ติดแท็กคำอธิบายประกอบคำหลักชั่วคราวและอื่น ๆ โปรแกรมเมอร์แต่ละคนกำหนดข้อมูลเมตาในแบบของเขาเองซึ่งแตกต่างจากวิธีมาตรฐานของ Annotation
ปัจจุบันเฟรมเวิร์กจำนวนมากใช้ XML และคำอธิบายประกอบร่วมกันเพื่อปรับสมดุลข้อดีและข้อเสียระหว่างทั้งสอง
คำอธิบายประกอบทำงานอย่างไร? จะเขียนคำอธิบายประกอบที่กำหนดเองได้อย่างไร?
ก่อนที่จะบอกส่วนนี้เราขอแนะนำให้คุณดาวน์โหลดคำอธิบายประกอบรหัสตัวอย่าง AnnotationsSample.zip ก่อน หลังจากดาวน์โหลดแล้วให้ใส่ใน IDE ที่คุณคุ้นเคยกับการใช้ รหัสเหล่านี้จะช่วยให้คุณเข้าใจกลไกคำอธิบายประกอบได้ดีขึ้น
การเขียนคำอธิบายประกอบนั้นง่ายมากคุณสามารถเปรียบเทียบคำจำกัดความของคำอธิบายประกอบกับคำจำกัดความของอินเทอร์เฟซ ลองดูสองตัวอย่าง: หนึ่งคือคำอธิบายประกอบมาตรฐาน @Override และอีกตัวอย่างหนึ่งคือคำอธิบายประกอบที่ผู้ใช้กำหนด @Todo
@Target (ElementType.Method) @retention (RetentionPolicy.Source) Public @Interface Override {}คุณอาจมีคำถามบางอย่างเกี่ยวกับคำอธิบายประกอบ @Override มันไม่ได้ทำอะไรเลยดังนั้นมันจะตรวจสอบได้อย่างไรว่ามีฟังก์ชั่นที่มีชื่อเดียวกันในคลาสพาเรนต์ แน่นอนอย่าแปลกใจฉันแค่ล้อเล่นคุณ คำจำกัดความของคำอธิบายประกอบ @Override ไม่ได้เป็นเพียงรหัสเล็ก ๆ น้อย ๆ เท่านั้น ส่วนหนึ่งของเนื้อหามีความสำคัญมากฉันต้องทำซ้ำอีกครั้ง: คำอธิบายประกอบเป็นเพียงข้อมูลเมตาและไม่มีส่วนเกี่ยวข้องกับตรรกะทางธุรกิจ มันค่อนข้างยากที่จะเข้าใจ แต่นั่นก็คือ หากคำอธิบายประกอบไม่มีตรรกะทางธุรกิจใครบางคนจะต้องนำไปใช้ ผู้ใช้ข้อมูลเมตาทำสิ่งนี้ คำอธิบายประกอบให้ข้อมูลเกี่ยวกับคุณสมบัติที่กำหนดเท่านั้น (คลาส/เมธอด/แพ็คเกจ/โดเมน) ผู้ใช้คำอธิบายประกอบ (อีกครั้งรหัสบางส่วน) อ่านข้อมูลนี้และใช้ตรรกะที่จำเป็น
เมื่อเราใช้คำอธิบายประกอบของ Java (เช่น @Override) JVM เป็นผู้ใช้ซึ่งทำงานในระดับ bytecode ณ จุดนี้นักพัฒนาแอปพลิเคชันไม่สามารถควบคุมหรือใช้คำอธิบายประกอบที่กำหนดเองได้ ดังนั้นเรามาอธิบายวิธีการเขียนคำอธิบายประกอบที่กำหนดเอง
มาพูดถึงประเด็นสำคัญของการเขียนคำอธิบายประกอบที่กำหนดเองทีละคน ในตัวอย่างด้านบนคุณจะเห็นคำอธิบายประกอบบางอย่างที่ใช้กับคำอธิบายประกอบ
เวอร์ชัน J2SE5.0 ให้คำอธิบายประกอบเมตาสี่ชนิดใน Java.lang.Annotation ซึ่งมีคำอธิบายประกอบอื่น ๆ โดยเฉพาะ: คำอธิบายประกอบอื่น ๆ :
@DOCOMENTED คำอธิบายประกอบแท็กคำอธิบายประกอบอย่างง่ายระบุว่าข้อมูลคำอธิบายประกอบถูกเพิ่มลงในเอกสาร Java หรือไม่
@retention กำหนดวงจรชีวิตของคำอธิบายประกอบนี้
RetentionPolicy.Source ถูกยกเลิกในระหว่างขั้นตอนการรวบรวม คำอธิบายประกอบเหล่านี้ไม่มีความหมายใด ๆ หลังจากการรวบรวมดังนั้นพวกเขาจึงไม่เขียน bytecode @Override, @suppresswarnings ทั้งหมดเป็นของคำอธิบายประกอบประเภทนี้
RetentionPolicy.class จะถูกยกเลิกเมื่อมีการโหลดคลาส มีประโยชน์ในการประมวลผลไฟล์ bytecode นี่คือวิธีเริ่มต้นสำหรับคำอธิบายประกอบ
RetentionPolicy.runtime จะไม่ถูกทิ้งและคำอธิบายประกอบจะถูกเก็บไว้ในช่วงเวลารันไทม์ดังนั้นข้อมูลของคำอธิบายประกอบสามารถอ่านได้โดยใช้กลไกการสะท้อนกลับ คำอธิบายประกอบที่กำหนดเองของเรามักจะใช้วิธีนี้
@Target ระบุว่ามีการใช้คำอธิบายประกอบนี้ที่ไหน หากไม่ได้ระบุคำอธิบายประกอบสามารถวางได้ทุกที่ นี่คือพารามิเตอร์ที่มีอยู่ ควรสังเกตว่าคำอธิบายประกอบของคุณลักษณะนั้นเข้ากันได้ หากคุณต้องการเพิ่มคำอธิบายประกอบลงในแอตทริบิวต์ทั้งหมด 7 รายการและไม่รวมแอตทริบิวต์หนึ่งรายการเท่านั้นคุณต้องกำหนดเป้าหมายเพื่อรวมแอตทริบิวต์ทั้งหมด
@Inherited กำหนดความสัมพันธ์ระหว่างคำอธิบายประกอบนี้และคลาสย่อย
ดังนั้นคำจำกัดความภายในของคำอธิบายประกอบเป็นอย่างไร? คำอธิบายประกอบสนับสนุนประเภทพื้นฐานประเภทสตริงและ enum เท่านั้น แอตทริบิวต์ทั้งหมดในความคิดเห็นถูกกำหนดเป็นวิธีการและอนุญาตให้มีค่าเริ่มต้น
@Target (ElementType.method) @retention (RetentionPolicy.runtime) @Interface toDo {public enum priority {ต่ำ, ปานกลาง, สูง} สถานะ enum สาธารณะ {เริ่มต้น, not_started} string uther () เริ่มต้น ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการใช้คำอธิบายประกอบข้างต้น
@todo (ลำดับความสำคัญ = todo.priority.medium, ผู้แต่ง = "yashwant", status = todo.status.started) โมฆะสาธารณะไม่สมบูรณ์ impletemethod1 () {// ตรรกะทางธุรกิจบางอย่างถูกเขียน // แต่ยังไม่สมบูรณ์}} หากมีแอตทริบิวต์เดียวในคำอธิบายประกอบสามารถตั้งชื่อได้โดยตรง "ค่า" และไม่จำเป็นต้องระบุชื่อแอตทริบิวต์เมื่อใช้งาน
@Interface ผู้แต่ง {ค่าสตริง ();}@ผู้แต่ง ("yashwant") โมฆะสาธารณะ somemethod () {} แต่จนถึงตอนนี้ทุกอย่างดูดีทีเดียว เรากำหนดคำอธิบายประกอบของเราเองและนำไปใช้กับวิธีตรรกะทางธุรกิจ ตอนนี้เราต้องเขียนโปรแกรมผู้ใช้เพื่อเรียกคำอธิบายประกอบของเรา ที่นี่เราต้องใช้กลไกการสะท้อนกลับ หากคุณคุ้นเคยกับรหัสสะท้อนคุณจะรู้ว่าการสะท้อนกลับสามารถให้ชื่อคลาสวิธีการและวัตถุตัวแปรอินสแตนซ์ วัตถุทั้งหมดเหล่านี้มีวิธี getannotation () เพื่อส่งคืนข้อมูลคำอธิบายประกอบ เราจำเป็นต้องแปลงวัตถุนี้เป็นความคิดเห็นที่กำหนดเองของเรา (หลังจากตรวจสอบด้วย instanceof ()) และเรายังสามารถเรียกวิธีการในความคิดเห็นที่กำหนดเอง ดูรหัสตัวอย่างต่อไปนี้โดยใช้คำอธิบายประกอบด้านบน:
คลาส BusinessLogicClass = BusinessLogic.class; สำหรับ (วิธีการ: BusinessLogicClass.getMethods ()) {toDo toDoannotation = (toDo) method.getAnnotation (toDo.class); ถ้า (toDoannotation! = null) {system.out.println toDoannotation.author ()); system.out.println ("ลำดับความสำคัญ:" + toDoannotation.priority ()); system.out.println ("สถานะ:" + toDoannotation.status ());}}}}กรณีการใช้คำอธิบายประกอบ
ฟังก์ชั่นของคำอธิบายประกอบมีประสิทธิภาพมากและกรอบการทำงานเช่นฤดูใบไม้ผลิและ Hebernate ใช้คำอธิบายประกอบในการบันทึกและความถูกต้อง สามารถใช้คำอธิบายประกอบได้เมื่อใช้อินเทอร์เฟซเครื่องหมาย ความแตกต่างคืออินเตอร์เฟสแท็กใช้เพื่อกำหนดคลาสที่สมบูรณ์ แต่คุณสามารถกำหนดความคิดเห็นสำหรับวิธีเดียวเช่นว่าจะเปิดเผยวิธีการเป็นบริการหรือไม่
คำอธิบายประกอบใหม่จำนวนมากได้รับการแนะนำใน Servlet 3.0 ล่าสุดโดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับ Servlet Security
Handlestypes คำอธิบายประกอบนี้ใช้เพื่อแสดงชุดของคลาสแอปพลิเคชันที่ส่งผ่านไปยัง ServletContainerInitializer
httpConstraint คำอธิบายประกอบนี้แสดงถึงข้อ จำกัด ด้านความปลอดภัยสำหรับการร้องขอแอปพลิเคชันของวิธี HTTP ทั้งหมดและแตกต่างจากข้อ จำกัด ด้านความปลอดภัย HTTPMETHODCONTRAINT ที่กำหนดไว้ในคำอธิบายประกอบ ServleTsecurity
HTTPMETHODCONTRAINT ระบุข้อ จำกัด ด้านความปลอดภัยสำหรับการร้องขอประเภทต่าง ๆ ซึ่งแตกต่างจากคำอธิบายประกอบที่อธิบายประเภทวิธีโปรโตคอล HTTP ในการเพิ่มความปลอดภัยของ ServleTsecurity
MultipartConfig คำอธิบายประกอบนี้มีการทำเครื่องหมายบน servlet ซึ่งบ่งชี้ว่าประเภท MIME ของคำขอที่ Servlet ต้องการดำเนินการคือ Multipart/Form-Data
Servletsecurity คำอธิบายประกอบถูกทำเครื่องหมายไว้ในคลาสมรดกของเซิร์ฟเล็ตและคำขอโปรโตคอล HTTP ถูกบังคับให้ต้องปฏิบัติตามข้อ จำกัด ด้านความปลอดภัย
เว็บฟิลเตอร์ ใช้เพื่อประกาศตัวกรองเซิร์ฟเวอร์
WebInitParam คำอธิบายประกอบนี้ใช้เพื่อประกาศพารามิเตอร์การเริ่มต้นใน servlet หรือตัวกรองและมักจะใช้กับ @webservlet หรือ @webfilter
WebListener คำอธิบายประกอบนี้เป็นผู้ฟังการประกาศเหตุการณ์ประเภทต่าง ๆ ในบริบทของเว็บแอปพลิเคชัน
WebServlet คำอธิบายประกอบนี้ใช้เพื่อประกาศการกำหนดค่าของ servlet
ADF (Framework แอปพลิเคชัน) และคำอธิบายประกอบ
ตอนนี้เราเริ่มพูดคุยเกี่ยวกับส่วนสุดท้ายของบทความ Framework แอปพลิเคชันหรือที่รู้จักกันในชื่อ ADF ได้รับการพัฒนาโดย Oracle เพื่อสร้างแอปพลิเคชัน Oracle Converged เราเข้าใจถึงข้อดีและข้อเสียของคำอธิบายประกอบและรู้วิธีการเขียนคำอธิบายประกอบที่กำหนดเอง แต่เราควรใช้คำอธิบายประกอบอย่างไร ADF มีคำอธิบายประกอบธรรมดาหรือไม่? คำถามที่ดีมีข้อ จำกัด บางประการในการใช้คำอธิบายประกอบใน ADF เฟรมเวิร์กแอปพลิเคชันที่กล่าวถึงก่อนหน้านี้เช่น Spring และ Hibernate ใช้ AOP (การเขียนโปรแกรมด้านข้าง) ใน AOP เฟรมเวิร์กให้กลไกในการฉีดโค้ดลงในการประมวลผลล่วงหน้าและการประมวลผลเหตุการณ์ที่ตามมา ตัวอย่างเช่น: คุณมีตะขอเพื่อเพิ่มรหัสก่อนและหลังการดำเนินการวิธีการเพื่อให้คุณสามารถเขียนรหัสผู้ใช้ของคุณในสถานที่เหล่านี้ ADF ไม่ได้ใช้ AOP หากเรามีกรณีการใช้งานใด ๆ สำหรับคำอธิบายประกอบเราอาจจำเป็นต้องใช้มันผ่านการสืบทอด
ฉันหวังว่าคุณจะชอบบทความนี้เพื่อช่วยให้คุณเข้าใจความหมายของคำอธิบายประกอบได้ดีขึ้น!