JavaRush /Java блогы /Random-KK /Java тілінде өз аннотацияларыңызды жасау
angelina
Деңгей

Java тілінде өз аннотацияларыңызды жасау

Топта жарияланған
Джонни Хакетт мақаласы, 2014 жылғы 14 шілде, 11:09 Егер сіз Java-да бағдарламаласаңыз және Spring және Hibernate сияқты танымал жақтаулардың кез келгенін пайдалансаңыз , онда сіз annotationларды пайдаланумен бұрыннан таныссыз. Қолданыстағы құрылыммен жұмыс істегенде, ішкі annotationлар жеткілікті. Бірақ өзіңіздің annotationларыңызды жасау қажет болса ше? Жақында менде бірнеше дерекқордан жалпы ақпаратты растауды қажет ететін жоба үшін өз annotationларымды жасауға себеп болды. Сценарий Бизнесте бірдей ақпаратты сақтайтын және деректерді әртүрлі жолдармен жаңартқан бірнеше дерекқор болды. Әртүрлі көздерден деректерді алуға байланысты проблемаларды жою үшін деректерді бір негізгі дерекқорға біріктіру жоспарланды. Бірақ жобаны бастамас бұрын, деректердің қаншалықты синхрондалмағанын анықтап, қажетті өзгерістерді енгізу қажет болды. Бірінші қадам әртүрлі дерекқорларда бірдей деректерді көрсететін және мәндерді растайтын немесе белгіленген салыстыру ережелеріне негізделген сәйкес келмейтін жазбаларды бөлектейтін есепті жасау болды. Төменде жобаны жүзеге асыру кезіндегі негізгі талаптардың үзіндісі берілген: • Тұтынушы аты, компания атауы немесе каталог ақпараты сияқты бірдей деректерді табу үшін бірнеше дерекқордағы деректерді салыстырыңыз. • Әдепкі бойынша, мән деректер түріне негізделген барлық дерекқорларда бірдей болуы керек. • Кейбір өрістер үшін біз тек мән табылғанын көрсеткіміз келді, бірақ мән салыстырылмады. • Басқа өрістер үшін біз тек мәнді табылғанмен салыстырғымыз және деректерді көрсетілген көзден алынған деректермен растағымыз келді. • Үшінші өрістер үшін жазбадағы басқа өрістердің мәніне негізделетін күрделі деректерді салыстыруды жасағымыз келді. • Төртінші өріс түрі үшін біз деректерді пішімдегіміз келді, мысалы, $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ның қашан қолжетімді болатынын көрсетуге мүмкіндік береді. Мүмкін мәндер: CLASS, RUNTIME және SOURCE. RUNTIME ішінде annotationларды өңдейтіндіктен, біз осы мәндерді орнатуымыз керек. Деректерді тексеру процесі әрбір дерекқорға қарсы бір сұрауды іске қосады, содан кейін нәтижелерді белгілі бір жазба түріне арналған барлық өрістер болып табылатын жалпы деректерде көрсетеді. Ортақ деректердегі әрбір өріске арналған annotation процессорға нақты өріс үшін деректерді, сондай-ақ әрбір дерекқорда табылған мәнді қалай салыстыру керектігін айтады. Бұл annotationларды әртүрлі деректерді салыстыру конфигурациялары үшін қалай пайдалануға болатынының бірнеше мысалдарын қарастырайық. Мәннің әрбір деректер көзінде бар екенін және дәл сәйкес келетінін растау үшін есеп өрісінде пайда болатын өріс идентификаторы мен белгіні беру қажет. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Әрбір деректер көзінен табылған мәндерді көрсету үшін, бірақ деректерді салыстыру үшін, compareSources элементін көрсетіп, мәнді жалған етіп орнату керек. Мәннің барлығы емес, белгілі бір деректер көзінде табылғанын растау үшін sourcesToCompare 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; элементін пайдалану керек . Бұл барлық табылған мәндерді көрсетеді, бірақ деректер көздеріндегі кез келген деректерді салыстыру элементтер тізіміне сәйкес орындалады. Бұл кейбір деректер барлық деректер көздерінде сақталмаған жағдайға арналған. ReconSource - деректер көздері салыстыру үшін қолжетімді болатын нөмір. Енді біз негізгі талаптарды орындадық, біз өріске тән күрделі деректерді салыстыруларды орындауымыз керек. Мұны істеу үшін біз ережелерді өңдеуді бастайтын екінші annotation жасаймыз. Алдыңғы annotationға өте ұқсас, бір үлкен айырмашылық мынада: @ReconCustomRule ішінде біз тексеру процесі басталған кезде деректерді салыстыруды іске қосатын сыныпты көрсетеміз. Сіз тек қолданылатын сыныпты көрсете аласыз, осылайша өңдеушіңіз мән тағайындайды және сіз көрсеткен кез келген классты инициализациялайды. Бұл annotationдағы көрсетілген сынып ереже интерфейсін пайдаланады, оны өз кезегінде ережені орындау үшін өңдеуші пайдаланады. Осы annotationның бірнеше мысалын қарастырайық. Бұл мысалда біз АҚШ-тан тыс валюта айырбастауларын тексеретін және бұл жағдайда деректерді салыстыруды өткізіп жіберетін ережені қолданамыз. Ол үшін сол жазбадағы ел өрісін тексеру керек. Міне, біз ереженің параметрлерін орнататын мысал, бұл жағдайда төзімділік мәні. Біздің деректерді салыстыру үшін салыстырылған мән 1000-нан артық ауытқуы мүмкін емес. Төзімділік мәнін көрсету үшін параметрді пайдалану әртүрлі рұқсат мәндері бар бірнеше өрістер үшін бірдей ережелерді пайдалануға мүмкіндік береді. Жалғыз мәселе - бұл параметрлер статикалық және annotationның сипатына байланысты динамикалық бола алмайды. 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 тілінде 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