JavaRush /Java blogi /Random-UZ /Java-da o'z izohlaringizni yaratish
angelina
Daraja

Java-da o'z izohlaringizni yaratish

Guruhda nashr etilgan
Jonny Hackett maqolasi, 2014-yil 14-iyul, 11:09 Agar siz Java-da dasturlashsangiz va Spring va Hibernate kabi mashhur ramkalardan foydalansangiz , siz izohlardan foydalanish bilan allaqachon tanishsiz. Mavjud ramka bilan ishlashda ichki izohlar etarli. Ammo o'zingizning izohlaringizni yaratishingiz kerak bo'lsa-chi? Yaqinda men bir nechta ma'lumotlar bazalaridan umumiy ma'lumotlarni tasdiqlashni talab qiladigan loyiha uchun o'z izohlarimni yaratish uchun sabab bor edi. Stsenariy Bir korxonada bir xil ma'lumotlarni saqlaydigan va ma'lumotlarni turli yo'llar bilan yangilaydigan bir nechta ma'lumotlar bazalari mavjud edi. Turli manbalardan ma'lumotlarni olish bilan bog'liq muammolarni bartaraf etish uchun ma'lumotlarni bitta asosiy ma'lumotlar bazasiga birlashtirish rejalashtirilgan edi. Ammo loyihani boshlashdan oldin, ma'lumotlar qanchalik sinxronlashtirilmaganligini aniqlash va kerakli o'zgarishlarni amalga oshirish kerak edi. Birinchi qadam, turli ma'lumotlar bazalarida bir xil ma'lumotlarni ko'rsatadigan va qiymatlarni tasdiqlaydigan yoki o'rnatilgan yarashuv qoidalariga asoslanib, mos kelmaydigan yozuvlarni ajratib ko'rsatadigan hisobot yaratish edi. Quyida loyihani amalga oshirish vaqtidagi asosiy talablardan parcha keltirilgan: • Mijoz nomi, kompaniya nomi yoki katalog maʼlumotlari kabi bir xil maʼlumotlarni topish uchun bir nechta maʼlumotlar bazalaridagi maʼlumotlarni solishtiring. • Odatiy bo'lib, qiymat ma'lumotlar turiga asoslangan barcha ma'lumotlar bazalarida aynan bir xil bo'lishi kerak. • Ba'zi maydonlar uchun biz faqat qiymat topilganligini ko'rsatmoqchi edik, lekin qiymat solishtirilmadi. • Boshqa maydonlar uchun biz faqat topilgan qiymat bilan qiymatni solishtirishni va ma'lumotlarni ko'rsatilgan manba ma'lumotlari bilan tasdiqlashni xohladik. • Uchinchi maydonlar uchun biz yozuv ichidagi boshqa maydonlar qiymatiga asoslangan murakkab ma'lumotlarni taqqoslashni amalga oshirmoqchi edik. • To'rtinchi maydon turi uchun biz ma'lumotlarni formatlashni xohladik, masalan, $000,000.00 valyuta formatida. • Hisobot MS Excel formatida bo'lishi kerak, har bir qatorda alohida manbadan olingan qiymat bo'lishi kerak. Qiymati ma'lumotlarni tasdiqlash shartlariga mos kelmaydigan har qanday satr sariq rangda ta'kidlanishi kerak. Izohlar Biz talablarni o'qib chiqib, talab qilinadigan narsalar bo'yicha bir nechta turli g'oyalarni ishlab chiqqanimizdan so'ng, men ma'lumotlarni taqqoslash konfiguratsiyasi va hisobot berish jarayonini ishga tushiradigan izohlardan foydalanishga qaror qildim. Bizga oddiy, ammo moslashuvchan va kengaytiriladigan yechim kerak edi. Ushbu izohlar maydon darajasida bo'ladi va menga konfiguratsiya sinf yo'lidagi biror joyda faylda yashirilmasligi yoqadi. Buning o'rniga, men maydon bilan bog'liq izohlarni ko'ra olaman, shuning uchun u qanday qayta ishlanishini aniq bilaman. Oddiy qilib aytganda, annotatsiya ma'lumotni taqdim etadigan, ammo kodning o'zi ishlashiga bevosita ta'sir qilmaydigan marker, metama'lumotlardan boshqa narsa bo'lmaydi. Agar siz ilgari Java-da dasturlashtirgan bo'lsangiz, izohlardan foydalanishni yaxshi bilishingiz kerak, lekin siz o'zingiznikini yaratishga hech qachon ehtiyoj sezmagan bo'lishingiz mumkin. Buni amalga oshirish uchun siz Java @interface turini ishlatadigan yangi turni yaratishingiz kerak , u o'z navbatida metadata tafsilotlarini belgilaydigan elementlarni o'z ichiga oladi. Loyihaga misol: 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 ma'lumotlarni taqqoslash jarayonini boshlash uchun asosiy izohdir. U turli xil ma'lumotlar manbalaridan ma'lumotlarni solishtirish uchun zarur bo'lgan asosiy elementlarni o'z ichiga oladi. @ReconField bizga kerak bo'lgan ko'p narsalarni bajarishi kerak, bundan keyinroq gaplashadigan murakkabroq ma'lumotlar taqqoslashlari bundan mustasno. Ushbu elementlarning aksariyati koddagi izohlar bilan izohlanadi. Nima bo'lishidan qat'iy nazar, bizning @ReconField- dagi bir nechta asosiy izohlarni alohida tushuntirish kerak. • @Target - Bu izoh sizga izoh qo'llanilishi kerak bo'lgan java elementlarini belgilash imkonini beradi. Foydalanish mumkin boʻlgan turlar: ANNOTATION_TYPE, KONSTRUKTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETRE va TYPE. FIELD darajasi uchun @ReconField izohimizda . • @Retention – Bu izoh sizga izoh qachon mavjud bo‘lishini belgilash imkonini beradi. Mumkin qiymatlar: CLASS, RUNTIME va SOURCE. RUNTIME da izohlarni qayta ishlayotganimiz uchun biz ushbu qiymatlarni o'rnatishimiz kerak. Ma'lumotlarni tekshirish jarayoni har bir ma'lumotlar bazasiga nisbatan bitta so'rovni bajaradi va keyin natijalar ma'lum bir yozuv turi uchun barcha maydonlar bo'lgan umumiy ma'lumotlarda ko'rsatiladi. Umumiy ma'lumotlardagi har bir maydon uchun izoh protsessorga ushbu soha uchun ma'lumotlarni, shuningdek, har bir ma'lumotlar bazasida topilgan qiymatni qanday solishtirish kerakligini aytadi. Keling, ushbu izohlardan turli xil ma'lumotlarni taqqoslash konfiguratsiyalari uchun qanday foydalanish mumkinligiga bir nechta misollarni ko'rib chiqaylik. Qiymat har bir ma'lumot manbasida mavjudligini va to'liq mos kelishini tasdiqlash uchun hisobot maydonida paydo bo'ladigan maydon identifikatori va yorlig'ini ko'rsatish kifoya. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Har bir ma'lumot manbasidan topilgan qiymatlarni ko'rsatish, lekin ma'lumotlarni taqqoslash uchun siz compareSources elementini ko'rsatishingiz va qiymatni noto'g'ri qilib belgilashingiz kerak. 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; Qiymat ma'lum bir ma'lumot manbasida topilganligini tasdiqlash uchun, lekin hammasi emas, siz sourcesToCompare elementidan foydalanishingiz kerak . Bu barcha topilgan qiymatlarni ko'rsatadi, ammo ma'lumotlar manbalarida har qanday ma'lumotlarni taqqoslash elementlar ro'yxatiga muvofiq amalga oshiriladi. Bu, agar ba'zi ma'lumotlar barcha ma'lumotlar manbalarida saqlanmagan bo'lsa. ReconSource - bu taqqoslash uchun ma'lumotlar manbalari mavjud bo'lgan raqam. 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; Endi biz asosiy talablarni bajarganimizdan so'ng, biz sohaga xos bo'lgan murakkabroq ma'lumotlarni taqqoslashimiz kerak. Buning uchun biz qoidalarni qayta ishlashni boshlaydigan ikkinchi izohni yaratamiz. 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 } Oldingi izohga juda o'xshash, bir katta farq shundaki, @ReconCustomRule da biz qayta tekshirish jarayoni boshlanganda ma'lumotlarni taqqoslashni amalga oshiradigan sinfni belgilaymiz. Siz faqat foydalaniladigan sinfni belgilashingiz mumkin, shunda ishlov beruvchingiz qiymat tayinlaydi va siz ko'rsatgan sinfni ishga tushiradi. Ushbu izohda ko'rsatilgan sinf qoida interfeysidan foydalanadi, bu esa o'z navbatida qoidani bajarish uchun ishlov beruvchi tomonidan qo'llaniladi. Keling, ushbu izohning bir nechta misollarini ko'rib chiqaylik. Ushbu misolda biz AQShdan tashqari valyuta almashinuvini tekshiradigan va bu holatda ma'lumotlarni taqqoslashni o'tkazib yuboradigan qoidadan foydalanmoqdamiz. Buning uchun biz bir xil yozuvdagi mamlakat maydonini tekshirishimiz kerak. 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; Mana, biz qoida parametrlarini o'rnatadigan misol, bu holda tolerantlik qiymati. Ma'lumotlarimizni solishtirish uchun taqqoslangan qiymat 1000 dan oshmasligi kerak. Tolerantlik qiymatini belgilash uchun parametrdan foydalanish bizga turli xil bardoshlik qiymatlari bilan bir nechta maydonlar uchun bir xil qoidalardan foydalanish imkonini beradi. Yagona muammo shundaki, bu parametrlar statik va izohning tabiati tufayli dinamik bo'lishi mumkin emas. 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; Ko'rib turganingizdek, biz ikkita oddiy izoh yordamida turli ma'lumotlar bazalaridagi ma'lumotlarni solishtirish jarayoniga biroz moslashuvchanlikni qo'shdik. Ushbu alohida holatda izohlar ma'lumotlarni taqqoslash jarayonini boshqaradi, shuning uchun biz umumiy ma'lumotlarda topilgan izohlarni baholaymiz va ularni qayta ishlashni boshqarish uchun foydalanamiz. Xulosa Java-da izohlar, ular nima qiladi va ulardan foydalanish qoidalari qanday bo'lishi haqida ko'plab maqolalar mavjud. Ushbu maqolada men misollar orqali nima uchun ulardan foydalanish kerakligini va undan qanday foyda olishingiz mumkinligini ko'rsatmoqchi edim. E'tibor bering, bu faqat boshlanishi. Izohlarni yaratishga qaror qilganingizdan so'ng, ulardan qanday qilib eng samarali tarzda foydalanishni aniqlashingiz kerak bo'ladi. 2-qismda men sizga Java aks ettirish yordamida izohlarni qanday qayta ishlashni ko'rsataman. — Jonny Hackett, asktheteam@keyholesoftware.com original maqola http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION