JavaRush /בלוג Java /Random-HE /יצירת הערות משלך ב-Java
angelina
רָמָה

יצירת הערות משלך ב-Java

פורסם בקבוצה
מאמר מאת Jonny Hackett 14 ביולי 2014 11:09 אם אתה מתכנת ב-Java ומשתמש בכל אחת מהמסגרות הפופולריות כגון Spring ו- Hibernate , אז אתה כבר מכיר את השימוש בהערות. כאשר עובדים עם מסגרת קיימת, הערות פנימיות מספיקות למדי. אבל מה אם אתה צריך ליצור הערות משלך? לא מזמן הייתה לי סיבה ליצור הערות משלי לפרויקט שדרש אישור של מידע נפוץ ממספר מאגרי מידע. תרחיש לעסק היו מסדי נתונים מרובים שאחסנו את אותו המידע ועדכנו את הנתונים בדרכים שונות. תוכנן לשלב את הנתונים למסד נתונים ראשי אחד כדי למנוע את הבעיות הקשורות בהשגת נתונים ממקורות שונים. אבל לפני תחילת הפרויקט, היה צורך לברר עד כמה הנתונים לא מסונכרנים ולבצע את השינויים הנדרשים. הצעד הראשון היה ליצור דוח שיציג את אותם נתונים בבסיסי נתונים שונים ויאשר את הערכים, או ידגיש את הרשומות שלא תואמות, בהתבסס על כללי התאמה שנקבעו. להלן קטע מהדרישות העיקריות בזמן הפרויקט: • השוו נתונים במספר מסדי נתונים כדי למצוא את אותם נתונים, כגון שם לקוח, שם חברה או פרטי ספרייה. • כברירת מחדל, הערך צריך להיות זהה לחלוטין בכל מסדי הנתונים בהתבסס על סוג הנתונים. • עבור חלק מהשדות רצינו רק להראות שהערך נמצא, אך הערך לא הושווה. • עבור שדות אחרים, רצינו רק להשוות את הערך עם מה שנמצא ולאשר את הנתונים עם הנתונים מהמקור שצוין. • עבור השדות השלישיים, רצינו לבצע השוואת נתונים מורכבת שתתבסס על הערך של שדות אחרים ברשומה. • עבור סוג השדה הרביעי, רצינו לעצב את הנתונים, למשל בפורמט המטבע $000,000.00. • הדוח צריך להיות בפורמט MS Excel, כל שורה צריכה להכיל ערך ממקור נפרד. כל שורה שהערך שלה אינו תואם את תנאי אישור הנתונים צריכה להיות מסומנת בצהוב. הערות לאחר שקראנו את הדרישות והגענו לכמה רעיונות שונים למה שנדרש, החלטתי להשתמש בהערות שיפעילו את תצורת השוואת הנתונים ותהליך הדיווח. היינו צריכים פתרון פשוט, אך גמיש וניתן להרחבה. ההערות הללו יהיו ברמת השדה ואני אוהב את העובדה שהתצורה לא תהיה מוסתרת בקובץ איפשהו בנתיב המחלקה. במקום זאת, אוכל לראות את ההערות המשויכות לשדה כך שאדע בדיוק כיצד הוא יעובד. במילים פשוטות, הערה לא תהיה יותר מסמן, מטא נתונים שיספקו מידע, אך לא ישפיעו ישירות על פעולת הקוד עצמו. אם תכנתת בעבר ב-Java, אתה אמור להכיר את השימוש בהערות, אבל אולי מעולם לא היית צריך ליצור משלך. לשם כך, עליך ליצור סוג חדש המשתמש בסוג Java @interface , אשר יכיל אלמנטים אשר בתורם מגדירים את פרטי המטא נתונים. הנה דוגמה לפרויקט: 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. • @Retention – הערה זו תאפשר לך לציין מתי ההערה תהיה זמינה. ערכים אפשריים הם CLASS, RUNTIME ו-SOURCE. מכיוון שאנו נעבד הערות ב-RUNTIME, עלינו להגדיר את הערכים הללו. תהליך אימות הנתונים יפעיל שאילתה אחת כנגד כל מסד נתונים, ולאחר מכן יציג את התוצאות בנתונים הכוללים, שהם כל השדות עבור סוג רשומה מסוים. הערה עבור כל שדה בנתונים המשותפים תגיד למעבד כיצד להשוות את הנתונים עבור השדה המסוים הזה, כמו גם את הערך שנמצא בכל מסד נתונים. הבה נסתכל על כמה דוגמאות כיצד ניתן להשתמש בהערות אלה עבור תצורות השוואת נתונים שונות. כדי לאשר שקיים ערך ותואם בדיוק בכל מקור נתונים, אתה רק צריך לספק מזהה שדה ותווית שיופיעו בשדה הדוח. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; כדי להציג את הערכים שנמצאו מכל מקור נתונים, אך לבצע השוואות נתונים, עליך לציין רכיב compareSources ולהגדיר את הערך ל-false. 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; כדי לאשר שערך נמצא במקור נתונים מסוים, אך לא בכולם, עליך להשתמש באלמנט sourcesToCompare . זה יציג את כל הערכים שנמצאו, אבל כל השוואת נתונים במקורות הנתונים תיעשה לפי רשימת האלמנטים. זה למקרה אם חלק מהנתונים לא נשמרים בכל מקורות הנתונים. ReconSource הוא אוסף שבו מקורות נתונים זמינים להשוואה. 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. — ג'וני האקט, 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