JavaRush /Java блогу /Random-KY /Java'да өзүңүздүн аннотацияларыңызды түзүү
angelina
Деңгээл

Java'да өзүңүздүн аннотацияларыңызды түзүү

Группада жарыяланган
Жонни Хакетттин макаласы 14-июль, 2014-ж., 11:09 Эгерде сиз Java-да программаласаңыз жана Spring жана Hibernate сыяктуу популярдуу алHowтарды колдонсоңуз , анда annotationларды колдонуу менен мурунтан эле таанышсыз. Учурдагы алHow менен иштөөдө ички annotationлар жетиштүү. Бирок сиз өз annotationларыңызды түзүшүңүз керек болсочы? Жакында эле менде бир нече маалымат базаларынан жалпы маалыматты ырастоону талап кылган долбоор үчүн өзүмдүн annotationмды түзүүгө негиз бар болчу. Сценарий Бизнесте бир эле маалыматты сактаган жана маалыматтарды ар кандай жолдор менен жаңырткан бир нече маалымат базалары болгон. Ар кандай булактардан маалыматтарды алуу менен байланышкан көйгөйлөрдү жоюу үчүн маалыматтарды бир башкы базага бириктирүү пландаштырылган. Бирок долбоорду баштоодон мурун, маалыматтар канчалык деңгээлде синхрондолуп калганын бorп, керектүү өзгөртүүлөрдү киргизүү керек болчу. Биринчи кадам ар кандай маалымат базаларында бирдей маалыматтарды көрсөтүү жана баалуулуктарды ырастоо, же белгиленген салыштыруу эрежелеринин негизинде дал келбеген жазууларды бөлүп көрсөтүү үчүн отчет түзүү болду. Төмөндө долбоор учурундагы негизги талаптардын үзүндүсү келтирилген: • Кардардын аты, компаниянын аты же каталог маалыматы сыяктуу бир эле маалыматтарды табуу үчүн бир нече маалымат базаларындагы маалыматтарды салыштырыңыз. • Демейки боюнча, маани берorштердин түрүнө жараша бардык маалымат базаларында так бирдей болушу керек. • Кээ бир талаалар үчүн биз маани табылганын гана көрсөткүбүз келген, бирок маани салыштырылган эмес. • Башка талаалар үчүн биз табылган нерсе менен маанини салыштырууну жана көрсөтүлгөн булактан алынган маалыматтар менен маалыматтарды ырастоону гана кааладык. • Үчүнчү талаалар үчүн биз жазуудагы башка талаалардын маанисине негизделе турган татаал маалыматтарды салыштырууну кааладык. • Төртүнчү талаа түрү үчүн биз маалыматтарды форматтагыбыз келди, мисалы, $000,000.00 валюта форматында. • Отчет MS Excel форматында болушу керек, ар бир сап өзүнчө булактан алынган маанини камтышы керек. Мааниси маалыматтарды тастыктоо шарттарына дал келбеген бардык сызыктар сары түс менен белгилениши керек. Аннотациялар Биз талаптарды окуп чыгып, талап кылынган нерселер боюнча бир нече түрдүү идеяларды ойлоп тапкандан кийин, мен маалыматтарды салыштыруу конфигурациясын жана отчеттуулук процессин козгой турган annotationларды колдонууну чечтим. Бизге жөнөкөй, бирок ийкемдүү жана кеңейтилүүчү чечим керек болчу. Бул annotationлар талаа деңгээлинде болот жана мага конфигурация класс жолунун бир жеринде файлда жашырылбай турганы жагат. Анын ордуна, мен талаага байланыштуу annotationларды көрө алам, андыктан ал кандайча иштетилерин так билем. Жөнөкөй сөз менен айтканда, annotation маркерден башка эч нерсе болбойт, ал маалымат берет, бирок codeдун иштөөсүнө түздөн-түз таасирин тийгизбейт. Эгер сиз мурда Javaда программалаган болсоңуз, annotationларды колдонуу менен тааныш болушуңуз керек, бирок өзүңүздүн оюңузду түзүүнүн кереги жок болушу мүмкүн. Бул үчүн, сиз 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 } Бул маалыматтарды салыштыруу процессин баштоо үчүн негизги annotation болуп саналат. Ал ар кандай маалымат булактарынан алынган маалыматтарды салыштыруу үчүн зарыл болгон негизги элементтерди камтыйт. @ReconField бизге керектүү нерселердин көбүн чечиши керек, биз кийинчерээк сүйлөшө турган татаал маалыматтарды салыштырууларды кошпогондо. Бул элементтердин көбү codeдогу комментарийлер менен түшүндүрүлөт. Кандай болбосун, биздин @ReconField ичиндеги бир нече негизги annotationлар өзүнчө түшүндүрүлүшү керек. • @Target – Бул annotation сизге annotation колдонула турган Java элементтерин көрсөтүүгө мүмкүндүк берет. Колдонууга мүмкүн болгон түрлөрү: ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER жана TYPE. FIELD деңгээли үчүн @ReconField annotationбызда . • @Retention – Бул annotation сизге annotation качан жеткorктүү болорун көрсөтүүгө мүмкүндүк берет. Мүмкүн болгон маанилер CLASS, RUNTIME жана SOURCE. RUNTIME ичинде annotationларды иштетип жаткандыктан, биз бул маанилерди коюшубуз керек. Маалыматтарды текшерүү процесси ар бир маалымат базасына каршы бир суроону иштетет, андан кийин натыйжаларды жалпы маалыматтарда көрсөтөт, бул белгилүү бир жазуу түрүнүн бардык талаалары. Бөлүшүлгөн берorштердеги ар бир талаа үчүн annotation процессорго ошол конкреттүү талаадагы маалыматтарды, ошондой эле ар бир маалымат базасында табылган маанини кантип салыштыруу керектигин айтып берет. Келгиле, бул annotationларды ар кандай маалыматтарды салыштыруу конфигурациялары үчүн кантип колдонсо болоруна байланыштуу бир нече мисалдарды карап көрөлү. Ар бир маалымат булагында маани бар экенин жана дал келгендигин тастыктоо үчүн, сиз жөн гана талаа ID жана отчет талаасында пайда боло турган энбелгисин беришиңиз керек. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Ар бир маалымат булагынан табылган маанилерди көрсөтүү үчүн, бирок маалыматтарды салыштыруу үчүн, сиз compareSources элементин көрсөтүп, маанини "false" деп коюшуңуз керек. Маани белгилүү бир маалымат булагында табылганын ырастоо үчүн, бирок бардыгында эмес, sourcesToCompare 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; элементин колдонушуңуз керек . Бул бардык табылган баалуулуктарды көрсөтөт, бирок маалымат булактарындагы маалыматтарды салыштыруу элементтердин тизмесине ылайык жүргүзүлөт. Бул кээ бир маалыматтар бардык маалымат булактарында сакталбаган учурда колдонулат. ReconSource - бул салыштыруу үчүн маалымат булактары бар энум. Эми биз негизги талаптарга жооп бергенден кийин, биз талаага мүнөздүү болгон татаалыраак маалыматтарды салыштырышыбыз керек. Бул үчүн биз эрежелерди иштетүүгө түрткү берүүчү экинчи annotationны түзөбүз. Мурунку annotationга абдан окшош, бир чоң айырма - @ReconCustomRuleде биз чалгындоо процесси башталганда маалыматтарды салыштырууну жүргүзө турган классты белгилейбиз. Колдонула турган классты гана белгилей аласыз, андыктан иштеткичиңиз маанини дайындайт жана сиз көрсөткөн классты инициализациялайт. Бул annotationда көрсөтүлгөн класс эреже интерфейсин колдонот, ал өз кезегинде эрежени аткаруу үчүн иштеткич тарабынан колдонулат. Келгиле, бул annotationнын бир нече мисалын карап көрөлү. Бул мисалда биз АКШдан тышкаркы валюта алмашууну текшере турган эрежени колдонуп жатабыз жана бул учурда маалыматтарды салыштырууну өткөрүп жиберебиз. Бул үчүн, ошол эле жазуудагы өлкө талаасын текшерүү керек. Бул жерде биз эреженин параметрлерин орноткон мисал, бул учурда сабырдуулук мааниси. Биздин маалыматтарды салыштыруу үчүн, салыштырылган маани 1000ден ашпоого тийиш. Толеранттуулук маанисин көрсөтүү үчүн параметрди колдонуу ар кандай толеранттуулук маанилери менен бир нече талаалар үчүн бирдей эрежелерди колдонууга мүмкүндүк берет. Бир гана көйгөй - бул параметрлер статикалык жана annotationнын мүнөзүнөн улам динамикалык боло алbyte. 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 } 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; 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; Көрүнүп тургандай, биз эки жөнөкөй annotationны колдонуу менен ар кандай маалымат базаларынан маалыматтарды салыштыруу процессине бир аз ийкемдүүлүк коштук. Бул конкреттүү учурда annotationлар маалыматтарды салыштыруу процессин жетектейт, ошондуктан биз жалпы маалыматтардан тапкан annotationларды баалайбыз жана аларды иштетүүнү жетектөө үчүн колдонобуз. Корутунду Java тorнде annotationлар жөнүндө көптөгөн макалалар бар, алар эмне кылат жана аларды колдонуу эрежелери кандай. Бул макалада мен мисалдар аркылуу аларды эмне үчүн колдонушуңуз керектигин жана андан кандай пайда ала аларыңызды көрсөткүм келди. Бул башталышы гана экенин эске алыңыз. Аннотацияларды түзүүнү чечкениңизден кийин, аларды эң натыйжалуу кантип колдонууну аныкташыңыз керек болот. 2-бөлүктө мен сизге Java чагылдыруу аркылуу annotationларды кантип иштетүү керектигин көрсөтөм. — Джонни Хакетт, 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