JavaRush /Java Blogu /Random-AZ /Java-da öz annotasiyalarınızı yaratmaq
angelina
Səviyyə

Java-da öz annotasiyalarınızı yaratmaq

Qrupda dərc edilmişdir
Jonny Hackett tərəfindən məqalə, 14 iyul 2014-cü il, 11:09 Java-da proqramlaşdırırsınızsa və SpringHibernate kimi məşhur çərçivələrdən hər hansı birini istifadə edirsinizsə , o zaman annotasiyaların istifadəsi ilə artıq tanışsınız. Mövcud çərçivə ilə işləyərkən daxili annotasiyalar kifayət qədərdir. Bəs öz annotasiyalarınızı yaratmağınız lazımdırsa nə olacaq? Çox keçməmiş bir çox verilənlər bazasından ümumi məlumatların təsdiqini tələb edən layihə üçün öz annotasiyalarımı yaratmaq üçün səbəbim var idi. Ssenari Bir işdə eyni məlumatı saxlayan və məlumatları müxtəlif yollarla yeniləyən çoxsaylı verilənlər bazası var idi. Müxtəlif mənbələrdən məlumatların əldə edilməsi ilə bağlı problemlərin aradan qaldırılması üçün məlumatların bir master verilənlər bazasında birləşdirilməsi nəzərdə tutulmuşdur. Ancaq layihəyə başlamazdan əvvəl məlumatların nə dərəcədə sinxron olmadığını öyrənmək və lazımi dəyişiklikləri etmək lazım idi. İlk addım müəyyən edilmiş tutuşdurma qaydalarına əsasən müxtəlif verilənlər bazalarında eyni məlumatları göstərən və dəyərləri təsdiqləyən və ya uyğun gəlməyən qeydləri vurğulayan hesabat yaratmaq idi. Aşağıda layihə zamanı əsas tələblərdən bir çıxarış verilmişdir: • Müştəri adı, şirkət adı və ya kataloq məlumatı kimi eyni məlumatları tapmaq üçün bir neçə verilənlər bazasındakı məlumatları müqayisə edin. • Defolt olaraq, dəyər məlumat növünə əsaslanan bütün verilənlər bazalarında tam olaraq eyni olmalıdır. • Bəzi sahələr üçün biz yalnız dəyərin tapıldığını göstərmək istədik, lakin dəyər müqayisə olunmadı. • Digər sahələr üçün biz yalnız dəyəri tapılanlarla müqayisə etmək və məlumatları göstərilən mənbədən alınan məlumatlarla təsdiqləmək istəyirdik. • Üçüncü sahələr üçün biz qeyd daxilindəki digər sahələrin dəyərinə əsaslanacaq kompleks məlumat müqayisəsi etmək istədik. • Dördüncü sahə növü üçün biz məlumatları, məsələn, $000,000.00 valyuta formatında formatlaşdırmaq istədik. • Hesabat MS Excel formatında olmalı, hər sətirdə ayrıca mənbədən alınan dəyər olmalıdır. Dəyəri məlumatın təsdiqi şərtlərinə uyğun gəlməyən hər hansı sətir sarı rənglə vurğulanmalıdır. Annotasiyalar Tələbləri oxuduqdan və tələb olunanlar üçün bir neçə fərqli fikir irəli sürdükdən sonra mən məlumatların müqayisəsi konfiqurasiyası və hesabat prosesini işə salacaq annotasiyalardan istifadə etmək qərarına gəldim. Bizə sadə, lakin çevik və genişləndirilə bilən bir həll lazım idi. Bu annotasiyalar sahə səviyyəsində olacaq və konfiqurasiyanın sinif yolunda bir faylda gizlədilməyəcəyini bəyənirəm. Əvəzində sahə ilə əlaqəli annotasiyaları görə biləcəyəm ki, onun necə işlənəcəyini dəqiq bilirəm. Sadə dillə desək, annotasiya markerdən, məlumat verəcək metadatadan başqa bir şey olmayacaq, lakin kodun özünün işinə birbaşa təsir göstərməyəcək. Əgər əvvəllər Java-da proqramlaşdırmısınızsa, annotasiyalardan istifadə ilə tanış olmalısınız, lakin heç vaxt öz annotasiyanızı yaratmağa ehtiyacınız olmaya bilər. Bunu etmək üçün Java @interface tipindən istifadə edən yeni tip yaratmalısınız ki, bu da öz növbəsində metadata təfərrüatlarını müəyyən edən elementləri ehtiva edir. Layihənin bir nümunəsidir: 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 } Bu, məlumatların müqayisəsi prosesinə başlamaq üçün əsas annotasiyadır. O, müxtəlif məlumat mənbələrindən məlumatları müqayisə etmək üçün tələb olunduğu kimi əsas tələb olunan elementləri ehtiva edir. @ReconField , daha sonra danışacağımız daha mürəkkəb məlumat müqayisələri istisna olmaqla, ehtiyacımız olan şeylərin əksəriyyətini idarə etməlidir. Bu elementlərin əksəriyyəti koddakı şərhlərlə izah olunur. Bundan asılı olmayaraq, @ReconField -dəki bir neçə əsas annotasiya ayrıca izah edilməlidir. • @Target – Bu annotasiya sizə annotasiyanın tətbiq edilməli olduğu java elementlərini təyin etməyə imkan verəcək. İstifadə oluna biləcək mümkün növlər bunlardır: ANNOTATION_TYPE, CONTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETRE və TYPE. FIELD səviyyəsi üçün @ReconField annotasiyamızda . • @Saxlama – Bu annotasiya sizə annotasiyanın nə vaxt mövcud olacağını müəyyən etməyə imkan verəcək. Mümkün dəyərlər CLASS, RUNTIME və SOURCE-dir. RUNTIME-da annotasiyaları işləyəcəyimiz üçün bu dəyərləri təyin etməliyik. Məlumatların yoxlanılması prosesi hər bir verilənlər bazasına qarşı bir sorğu keçirəcək və sonra nəticələri xüsusi qeyd növü üçün bütün sahələr olan ümumi məlumatda göstərəcək. Paylaşılan verilənlərdəki hər bir sahə üçün annotasiya prosessora həmin xüsusi sahə üçün məlumatları, eləcə də hər bir verilənlər bazasında tapılan dəyəri necə müqayisə edəcəyini söyləyəcək. Bu annotasiyaların müxtəlif verilənlərin müqayisəsi konfiqurasiyaları üçün necə istifadə oluna biləcəyinə dair bir neçə nümunəyə baxaq. Dəyərin hər bir məlumat mənbəyində mövcud olduğunu və tam uyğun gəldiyini təsdiqləmək üçün siz sadəcə hesabat sahəsində görünəcək sahə ID və etiketi təqdim etməlisiniz. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Hər bir məlumat mənbəyindən tapılan dəyərləri göstərmək, lakin məlumat müqayisəsi etmək üçün siz bir compareSources elementini təyin etməli və dəyəri false olaraq təyin etməlisiniz. 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; Dəyərin hamısında deyil, müəyyən bir məlumat mənbəyində tapıldığını təsdiqləmək üçün siz sourcesToCompare elementindən istifadə etməlisiniz . Bu, bütün tapılmış dəyərləri göstərəcək, lakin məlumat mənbələrində hər hansı məlumat müqayisəsi elementlərin siyahısına uyğun olaraq həyata keçiriləcək. Bu, bəzi məlumatların bütün məlumat mənbələrində saxlanmadığı hal üçündür. ReconSource , müqayisə üçün məlumat mənbələrinin mövcud olduğu bir nömrədir. 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; İndi əsas tələbləri yerinə yetirdiyimizə görə, sahəyə xas olan daha mürəkkəb verilənlər müqayisəsi aparmalıyıq. Bunu etmək üçün biz qaydaların işlənməsini tetikleyecek ikinci annotasiya yaradacağıq. 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 } Əvvəlki annotasiyaya çox bənzəyir, bir böyük fərq ondan ibarətdir ki, @ReconCustomRule- də kəşfiyyat prosesi başlayanda məlumatların müqayisəsini həyata keçirəcək bir sinif təyin edirik. Siz yalnız istifadə olunacaq sinfi təyin edə bilərsiniz, beləliklə işləyiciniz dəyər təyin edəcək və təyin etdiyiniz sinfi işə salacaq. Bu annotasiyada göstərilən sinif qayda interfeysindən istifadə edəcək, bu da öz növbəsində qaydanı icra etmək üçün işləyici tərəfindən istifadə olunacaq. Bu annotasiyanın bir neçə nümunəsinə baxaq. Bu nümunədə biz qeyri-ABŞ valyuta mübadiləsini yoxlayacaq və bu halda məlumatların müqayisəsini atlayacaq bir qaydadan istifadə edirik. Bunun üçün eyni qeyddə ölkə sahəsini yoxlamaq lazımdır. 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; Budur, qaydanın parametrlərini, bu halda tolerantlıq dəyərini təyin etdiyimiz bir nümunə. Məlumatlarımızı müqayisə etmək üçün müqayisə edilən dəyər 1000-dən çox kənara çıxa bilməz. Dözümlülük dəyərini təyin etmək üçün parametrdən istifadə etmək bizə fərqli dözümlülük dəyərlərinə malik bir neçə sahə üçün eyni qaydaları istifadə etməyə imkan verəcək. Yeganə problem odur ki, bu parametrlər statikdir və annotasiyanın xarakterinə görə dinamik ola bilməz. 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; Gördüyünüz kimi, biz iki kifayət qədər sadə annotasiyadan istifadə etməklə müxtəlif verilənlər bazalarından məlumatların müqayisəsi prosesinə bir az çeviklik əlavə etdik. Bu xüsusi hal üçün annotasiyalar verilənlərin müqayisəsi prosesini idarə edir ki, biz mahiyyətcə paylaşılan məlumatlarda tapdığımız annotasiyaları qiymətləndirək və emal zamanı onlardan istifadə edək. Nəticə Java-da annotasiyalar, onların nə etdiyi və onlardan istifadə qaydaları haqqında çoxlu məqalələr var. Bu yazıda mən nümunələr vasitəsilə onlardan niyə istifadə etməli olduğunuzu və bundan hansı faydaları əldə edə biləcəyinizi göstərmək istədim. Nəzərə alın ki, bu, yalnız başlanğıcdır. Annotasiyalar yaratmağa qərar verdikdən sonra onlardan ən effektiv şəkildə necə istifadə edəcəyinizi anlamalı olacaqsınız. 2-ci hissədə mən sizə Java əksindən istifadə edərək annotasiyaları necə emal edəcəyinizi göstərəcəyəm. — Jonny Hackett, asktheteam@keyholesoftware.com orijinal məqalə http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION