JavaRush /จาวาบล็อก /Random-TH /การสร้างคำอธิบายประกอบของคุณเองใน Java
angelina
ระดับ

การสร้างคำอธิบายประกอบของคุณเองใน Java

เผยแพร่ในกลุ่ม
บทความโดย Jonny Hackett 14 กรกฎาคม 2014 11:09 น. หากคุณเขียนโปรแกรมใน Java และใช้เฟรมเวิร์กยอดนิยมใดๆ เช่นSpringและHibernateแสดงว่าคุณคุ้นเคยกับการใช้คำอธิบายประกอบอยู่แล้ว เมื่อทำงานกับเฟรมเวิร์กที่มีอยู่ คำอธิบายประกอบภายในก็เพียงพอแล้ว แต่ถ้าคุณต้องการสร้างคำอธิบายประกอบของคุณเองล่ะ ไม่นานมานี้ ฉันมีเหตุผลที่จะสร้างคำอธิบายประกอบของตัวเองสำหรับโปรเจ็กต์ที่ต้องการการยืนยันข้อมูลทั่วไปจากฐานข้อมูลหลายแห่ง สถานการณ์จำลอง ธุรกิจมีหลายฐานข้อมูลที่เก็บข้อมูลเดียวกันและอัปเดตข้อมูลด้วยวิธีที่ต่างกัน มีการวางแผนที่จะรวมข้อมูลไว้ในฐานข้อมูลหลักเดียวเพื่อขจัดปัญหาที่เกี่ยวข้องกับการรับข้อมูลจากแหล่งต่างๆ แต่ก่อนที่จะเริ่มโปรเจ็กต์ จำเป็นต้องค้นหาว่าข้อมูลไม่ซิงค์กันอย่างไร และทำการเปลี่ยนแปลงที่จำเป็น ขั้นตอนแรกคือการสร้างรายงานที่จะแสดงข้อมูลเดียวกันในฐานข้อมูลที่แตกต่างกันและยืนยันค่า หรือเน้นบันทึกที่ไม่ตรงกัน ตามกฎการกระทบยอดที่กำหนดไว้ ด้านล่างนี้เป็นข้อความที่ตัดตอนมาจากข้อกำหนดหลัก ณ เวลาของโครงการ: • เปรียบเทียบข้อมูลในฐานข้อมูลต่างๆ เพื่อค้นหาข้อมูลเดียวกัน เช่น ชื่อลูกค้า ชื่อบริษัท หรือข้อมูลไดเร็กทอรี • ตามค่าเริ่มต้น ค่าควรเหมือนกันทุกประการในฐานข้อมูลทั้งหมดตามประเภทข้อมูล • สำหรับบางฟิลด์ เราเพียงต้องการแสดงว่าพบค่าแล้ว แต่ไม่ได้เปรียบเทียบค่า • สำหรับช่องอื่นๆ เราเพียงต้องการเปรียบเทียบค่ากับสิ่งที่พบและยืนยันข้อมูลด้วยข้อมูลจากแหล่งที่ระบุ • สำหรับฟิลด์ที่สาม เราต้องการทำการเปรียบเทียบข้อมูลที่ซับซ้อนซึ่งจะขึ้นอยู่กับค่าของฟิลด์อื่นภายในเรกคอร์ด • สำหรับประเภทฟิลด์ที่สี่ เราต้องการจัดรูปแบบข้อมูล เช่น ในรูปแบบสกุลเงิน $000,000.00 • รายงานจะต้องอยู่ในรูปแบบ MS Excel แต่ละแถวควรมีค่าจากแหล่งที่แยกจากกัน บรรทัดใดๆ ที่มีค่าไม่ตรงกับเงื่อนไขการยืนยันข้อมูลควรเน้นด้วยสีเหลือง คำอธิบายประกอบ หลังจากที่เราอ่านข้อกำหนดและเกิดแนวคิดที่แตกต่างกันสองสามข้อเกี่ยวกับสิ่งที่จำเป็น ฉันตัดสินใจใช้คำอธิบายประกอบที่จะทริกเกอร์การกำหนดค่าการเปรียบเทียบข้อมูลและกระบวนการรายงาน เราต้องการโซลูชันที่เรียบง่าย แต่ยืดหยุ่นและขยายได้ คำอธิบายประกอบเหล่านี้จะอยู่ในระดับฟิลด์ และฉันชอบตรงที่การกำหนดค่าจะไม่ถูกซ่อนอยู่ในไฟล์ที่ใดที่หนึ่งบนเส้นทางคลาส แต่ฉันจะสามารถดูคำอธิบายประกอบที่เกี่ยวข้องกับฟิลด์นั้นได้ ดังนั้นฉันจึงรู้แน่ชัดว่าจะดำเนินการอย่างไร พูดง่ายๆ ก็คือ คำอธิบายประกอบจะเป็นเพียงเครื่องหมาย ซึ่งเป็นข้อมูลเมตาที่จะให้ข้อมูล แต่จะไม่ส่งผลโดยตรงต่อการทำงานของโค้ดเอง หากคุณเคยเขียนโปรแกรมด้วย Java มาก่อน คุณควรคุ้นเคยกับการใช้คำอธิบายประกอบ แต่คุณอาจไม่จำเป็นต้องสร้างคำอธิบายประกอบของคุณเองเลย ในการดำเนินการนี้ คุณต้องสร้างประเภทใหม่ที่ใช้ Java @interface type ซึ่งจะมีองค์ประกอบที่จะกำหนดรายละเอียดข้อมูลเมตา นี่คือตัวอย่างของโครงการ: 1@Target(ElementType.FIELD) 2@Retention(RetentionPolicy.RUNTIME) 3public @interface ReconField { 4 5 /** 6 * Значение, которое определяет из Howого источника сравниваются данные, or будет использоваться для 7 отображения значения or для ссылки на правило. 8 * 9 * @return Значение, если источники должны быть сравнены, по умолчанию true. 10 */ 11 boolean compareSources() default true; 12 13 /** 14 * Значение показывает формат, который используется для отображения значения в отчете. 15 * 16 * @return Установленный формам, по умолчанию native. 17 */ 18 ReconDisplayFormat displayFormat() default ReconDisplayFormat.NATIVE; 19 20 /** 21 * Значение, показывающее meaning ID используемого поля для одинаковых значений из источника до поля. 22 * 23 * @return ID поля. 24 */ 25 String id(); 26 27 /** 28 * Значение, показывающее ярлык, который будет отображается в отчете для поля. 29 * 30 * @return Значение ярлыка, по умолчанию пустая строка. 31 */ 32 String label() default ""; 33 34 /** 35 * Значение, показывающее источник, который должен быть сравнен на предмет различий. 36 * 37 * @return Список источников для сравнения. 38 */ 39 ReconSource[] sourcesToCompare() default {}; 40 } นี่คือคำอธิบายประกอบหลักที่จะเริ่มกระบวนการเปรียบเทียบข้อมูล ประกอบด้วยองค์ประกอบพื้นฐานที่จำเป็น ตามความจำเป็น สำหรับการเปรียบเทียบข้อมูลจากแหล่งข้อมูลต่างๆ @ReconFieldควรจัดการสิ่งที่เราต้องการส่วนใหญ่ ยกเว้นการเปรียบเทียบข้อมูลที่ซับซ้อนมากขึ้น ซึ่งเราจะพูดถึงในภายหลัง องค์ประกอบเหล่านี้ส่วนใหญ่อธิบายได้จากความคิดเห็นในโค้ด ไม่ว่าคำอธิบายประกอบหลักสองสามรายการใน @ReconField ของเรา ต้องอธิบายแยกกันก็ตาม • @Target – คำอธิบายประกอบนี้จะช่วยให้คุณสามารถระบุองค์ประกอบ Java ที่ควรนำคำอธิบายประกอบไปใช้ ประเภทที่เป็นไปได้คือ: ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER และ TYPE ใน คำอธิบายประกอบ @ReconField ของเรา สำหรับระดับ FIELD • @ การเก็บรักษา – คำอธิบายประกอบนี้จะช่วยให้คุณสามารถระบุได้ว่าคำอธิบายประกอบจะพร้อมใช้งานเมื่อใด ค่าที่เป็นไปได้คือ CLASS, RUNTIME และ SOURCE เนื่องจากเราจะประมวลผลคำอธิบายประกอบใน RUNTIME เราจึงต้องตั้งค่าเหล่านี้ กระบวนการตรวจสอบข้อมูลจะเรียกใช้หนึ่งแบบสอบถามกับแต่ละฐานข้อมูล จากนั้นจึงแสดงผลลัพธ์ในข้อมูลโดยรวม ซึ่งเป็นฟิลด์ทั้งหมดสำหรับประเภทบันทึกเฉพาะ คำอธิบายประกอบสำหรับแต่ละฟิลด์ในข้อมูลที่ใช้ร่วมกันจะบอกโปรเซสเซอร์ถึงวิธีเปรียบเทียบข้อมูลสำหรับฟิลด์นั้น ๆ รวมถึงค่าที่พบในแต่ละฐานข้อมูล ลองดูตัวอย่างเล็กๆ น้อยๆ ของวิธีการใช้คำอธิบายประกอบเหล่านี้กับการกำหนดค่าการเปรียบเทียบข้อมูลต่างๆ เพื่อยืนยันว่ามีค่าอยู่และตรงกันทุกประการในแหล่งข้อมูลแต่ละแหล่ง คุณเพียงแค่ต้องระบุรหัสฟิลด์และป้ายกำกับที่จะปรากฏในช่องรายงาน 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; หากต้องการแสดงค่าที่พบจากแหล่งข้อมูลแต่ละแห่ง แต่ทำการเปรียบเทียบข้อมูล คุณจะต้องระบุองค์ประกอบ comparisonSources และตั้งค่าเป็นเท็จ 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; เพื่อยืนยันว่าพบค่าในแหล่งข้อมูลบางแห่ง แต่ไม่ใช่ทั้งหมด คุณต้องใช้องค์ประกอบ SourceToCompare ซึ่งจะแสดงค่าที่พบทั้งหมด แต่การเปรียบเทียบข้อมูลในแหล่งข้อมูลจะดำเนินการตามรายการองค์ประกอบ กรณีนี้หากข้อมูลบางอย่างไม่ได้รับการบันทึกในแหล่งข้อมูลทั้งหมด ReconSourceคือ enum ที่มีแหล่งข้อมูลสำหรับการเปรียบเทียบ 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; ตอนนี้เราปฏิบัติตามข้อกำหนดพื้นฐานแล้ว เราจำเป็นต้องดำเนินการเปรียบเทียบข้อมูลที่ซับซ้อนมากขึ้นตามเขตข้อมูลเฉพาะ ในการทำเช่นนี้ เราจะสร้างคำอธิบายประกอบที่สองที่จะทริกเกอร์การประมวลผลกฎ 1 @Target(ElementType.FIELD) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface ReconCustomRule { 4 5 /** 6 * Значение, указывающее используемые параметры, прописанные обработчику правила, meaning по умолчанию - 7 отсутствие параметров. 8 * 9 * @return The String[] параметры, прописанные обработчику правила 10 */ 11 String[] params() default {}; 12 13 /** 14 * Значение, указывающее класс обработчика правила, которое используется для сравнения значений из 15 каждого источника данных. 16 * 17 * @return Класс обработчика правила 18 */ 19 Class processor() default DefaultReconRule.class; 20 } คล้ายกับคำอธิบายประกอบก่อนหน้านี้มาก ข้อแตกต่างที่สำคัญประการหนึ่งคือใน @ReconCustomRuleเราระบุคลาสที่จะรันการเปรียบเทียบข้อมูลเมื่อกระบวนการรีคอนเริ่มต้นขึ้น คุณสามารถระบุได้เฉพาะคลาสที่จะใช้เท่านั้น ดังนั้นตัวจัดการของคุณจะกำหนดค่าและเริ่มต้นคลาสใดก็ตามที่คุณระบุ คลาสที่ระบุในคำอธิบายประกอบนี้จะใช้อินเทอร์เฟซของกฎ ซึ่งในทางกลับกันจะถูกใช้โดยตัวจัดการเพื่อดำเนินการกฎ ลองดูตัวอย่างบางส่วนของคำอธิบายประกอบนี้ ในตัวอย่างนี้ เรากำลังใช้กฎที่จะตรวจสอบการแลกเปลี่ยนสกุลเงินที่ไม่ใช่ของสหรัฐอเมริกา และจะข้ามการเปรียบเทียบข้อมูลในกรณีนี้ เมื่อต้องการทำเช่นนี้ เราจำเป็นต้องตรวจสอบฟิลด์ประเทศในเรกคอร์ดเดียวกัน 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; นี่คือตัวอย่างที่เราตั้งค่าพารามิเตอร์ของกฎ ในกรณีนี้คือค่าที่ยอมรับได้ เพื่อเปรียบเทียบข้อมูลของเรา ค่าที่เปรียบเทียบต้องไม่เบี่ยงเบนเกิน 1,000 การใช้พารามิเตอร์เพื่อระบุค่าความอดทนจะทำให้เราสามารถใช้กฎเดียวกันสำหรับหลายๆ ฟิลด์ โดยมีค่าความอดทนที่แตกต่างกัน ปัญหาเดียวคือพารามิเตอร์เหล่านี้เป็นแบบคงที่และไม่สามารถเป็นไดนามิกได้เนื่องจากลักษณะของคำอธิบายประกอบ 1 @ReconField(id = USD_MKT_CAP, label = "MARKET CAP USD", displayFormat = 2 ReconDisplayFormat.NUMERIC_WHOLE, sourcesToCompare = 3 { ReconSource.LEGACY, ReconSource.PACE, ReconSource.BOB_PRCM }) 4 @ReconCustomRule(processor = ToleranceAmountRule.class, params = { "10000" }) 5 private BigDecimal usdMktCap; อย่างที่คุณเห็น เราได้เพิ่มความยืดหยุ่นให้กับกระบวนการเปรียบเทียบข้อมูลจากฐานข้อมูลต่างๆ โดยใช้คำอธิบายประกอบที่ค่อนข้างง่ายสองรายการ สำหรับกรณีเฉพาะนี้ คำอธิบายประกอบจะขับเคลื่อนกระบวนการเปรียบเทียบข้อมูล เพื่อที่เราจะได้ประเมินคำอธิบายประกอบที่เราพบในข้อมูลที่แชร์ และใช้เป็นแนวทางในการประมวลผล มีบทความมากมายเกี่ยวกับคำอธิบายประกอบใน Java สิ่งที่พวกเขาทำและกฎในการใช้งานมีอะไรบ้าง ในบทความนี้ ฉันต้องการแสดงตัวอย่างว่าทำไมคุณจึงควรใช้มันและวิธีที่คุณจะได้ประโยชน์จากมัน โปรดทราบว่านี่เป็นเพียงจุดเริ่มต้นเท่านั้น เมื่อคุณตัดสินใจที่จะสร้างคำอธิบายประกอบ คุณจะต้องหาวิธีใช้งานคำอธิบายประกอบอย่างมีประสิทธิภาพสูงสุด ในส่วนที่ 2 ฉันจะแสดงวิธีการประมวลผลคำอธิบายประกอบโดยใช้การสะท้อนกลับของ Java — Jonny Hackett บทความต้นฉบับ Asktheteam@keyholesoftware.com http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION