JavaRush /Java Blog /Random-TL /Paglikha ng iyong sariling mga anotasyon sa Java
angelina
Antas

Paglikha ng iyong sariling mga anotasyon sa Java

Nai-publish sa grupo
artikulo ni Jonny Hackett Hulyo 14, 2014 11:09 am Kung nagprograma ka sa Java at gumagamit ng alinman sa mga sikat na framework gaya ng Spring at Hibernate , kung gayon ay pamilyar ka na sa paggamit ng mga anotasyon. Kapag nagtatrabaho sa isang umiiral na balangkas, ang mga panloob na anotasyon ay sapat na. Ngunit paano kung kailangan mong gumawa ng sarili mong mga anotasyon? Hindi nagtagal, nagkaroon ako ng dahilan upang lumikha ng sarili kong mga anotasyon para sa isang proyekto na nangangailangan ng kumpirmasyon ng karaniwang impormasyon mula sa ilang mga database. Sitwasyon Ang isang negosyo ay may maraming database na nag-imbak ng parehong impormasyon at nag-update ng data sa iba't ibang paraan. Ito ay pinlano na pagsamahin ang data sa isang master database upang maalis ang mga problema na nauugnay sa pagkuha ng data mula sa iba't ibang mga mapagkukunan. Ngunit bago simulan ang proyekto, kinakailangan upang malaman kung paano out of sync ang data at gawin ang mga kinakailangang pagbabago. Ang unang hakbang ay lumikha ng isang ulat na magpapakita ng parehong data sa iba't ibang database at kumpirmahin ang mga halaga, o i-highlight ang mga talaang iyon na hindi tumugma, batay sa itinatag na mga panuntunan sa pagkakasundo. Nasa ibaba ang isang sipi ng mga pangunahing kinakailangan sa oras ng proyekto: • Paghambingin ang data sa ilang mga database upang mahanap ang parehong data, tulad ng pangalan ng customer, pangalan ng kumpanya o impormasyon ng direktoryo. • Bilang default, ang halaga ay dapat na eksaktong pareho sa lahat ng mga database batay sa uri ng data. • Para sa ilang mga field gusto lang naming ipakita na ang halaga ay natagpuan, ngunit ang halaga ay hindi inihambing. • Para sa iba pang mga field, gusto lang naming ihambing ang halaga sa kung ano ang nakita at kumpirmahin ang data sa data mula sa tinukoy na pinagmulan. • Para sa mga ikatlong field, gusto naming gumawa ng kumplikadong paghahambing ng data na ibabatay sa halaga ng iba pang mga field sa loob ng talaan. • Para sa ikaapat na uri ng field, gusto naming i-format ang data, halimbawa sa currency na format na $000,000.00. • Ang ulat ay kailangang nasa MS Excel na format, ang bawat hilera ay dapat maglaman ng isang halaga mula sa isang hiwalay na pinagmulan. Anumang linya na ang halaga ay hindi tumutugma sa mga kundisyon ng pagkumpirma ng data ay dapat na naka-highlight sa dilaw. Аннотации После того, How мы прочитали требования и озвучor несколько разных идей воплощения того, что требуется, я решил использовать аннотации, которые запустят конфигурацию сравнения данных и процесс отчета. Нам требовалось просто, но гибкое и расширяемое решение. Эти аннотации будут на уровне поля и мне понравилось то, что конфигурацию не будет скрыта в файле, где-нибудь в пути класса. Вместо этого я смогу видеть аннотации ассоциированные с полем, чтобы точно знать How оно будет обработано. Проще говоря - annotation будет ничем иным How маркером, метаданные которая будет предоставлять информацию, но не будет напрямую воздействовать на работу самого 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 должны быть объяснены отдельно. • @Target – Эта annotation позволит вам указать те java элементы, к которой annotation должна быть применена. Возможные типы для применения такие: ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER и TYPE. В нашей @ReconField annotation для уровня FIELD. • @Retention – Эта annotation позволит вам указать, когда annotation будет доступна. Возможные значения: CLASS, RUNTIME и SOURCE. Так How мы будет обрабатывать аннотации в RUNTIME, мы должны установить эти значения. Процесс подтверждения данных будет идти в один request к каждой базе данных, и затем отобразит результаты в общих данных, которые представляют собой все поля для определенного типа записи. Аннотация для каждого поля в общих данных сообщит процессору How совершать сравнение данных для этого определенного поля, а так же meaning, найденное в каждой базе данных. Давайте посмотрим на несколько примеров того, How эти аннотации могу быть использованы для различных конфигураций сравнения данных. Whatбы подтвердить, что meaning существует и точно соответствует в каждом источнике данных, вам всего лишь надо предоставить ID поля и ярлык, который будет отображаться в поле отчета. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Whatбы отобразить найденные значения из каждого источника данных, но делать сравнения данных, вам нужно указать элемент compareSources и поставить meaning на false. 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; Whatбы подтвердить, что meaning найдено в определенном источник данных, но не во всех, вам нужно использовать элемент sourcesToCompare. Это отобразить все найденные значения, но сравнение любых данных в источниках данных произойдет в соответствии со списком элементов. Это для случая, если некоторые данные не сохранены во всех источниках данных. ReconSource - это enum, в котором источники данных доступны для сравнения. 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; Теперь, когда мы выполнor основные требования, нам нужно выполнить сравнение более сложных данных, которые специфичный для поля. Whatбы сделать это мы создадим вторую аннотацию, которая запустит обработку правил. 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 мы указываем класс, которые запустит сравнение данных, когда запускается процесс recon. Вы можете указать только класс, который будет использован, чтобы ваш обработчик приписал meaning и инициализировал любой класс, который вы укажите. Указанный класс в данной аннотации, будет использовать интерфейс правила, который в свою очередь будет использован обработчиком для исполнения правила. Давайте посмотрим пару примеров данной аннотации. В этом примере мы используем правило, которое проверит обмен валюты не в США и в этом случае пропустит сравнение данных. Whatбы сделать это, нам надо проверить поле страны в той же записи. 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; Вот пример, в котором мы задаем параметры правила, в данном случае meaning допустимого отклонения. Для сравнения наших данных, сравниваемое meaning не может отклоняться более чем на 1,000. Используя параметр для указания значения отклонения позволит нам использовать то же правила для нескольких полей, с разным meaningм допустимого отклонения. Единственная проблема в том, что эти параметры статические и не могут быть динамическими по причине природы аннотации. 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; Gaya ng nakikita mo, nagdagdag kami ng ilang flexibility sa proseso ng paghahambing ng data mula sa iba't ibang database sa pamamagitan ng paggamit ng dalawang medyo simpleng anotasyon. Para sa partikular na kaso na ito, hinihimok ng mga annotation ang proseso ng paghahambing ng data, nang sa gayon ay sinusuri namin ang mga anotasyong makikita namin sa nakabahaging data at ginagamit namin ang mga ito upang gabayan ang pagproseso. Konklusyon Mayroong maraming mga artikulo sa mga anotasyon sa Java, kung ano ang kanilang ginagawa at kung ano ang mga patakaran para sa paggamit ng mga ito. Sa artikulong ito nais kong ipakita, sa pamamagitan ng mga halimbawa, kung bakit mo dapat gamitin ang mga ito at kung paano ka makikinabang mula dito. Pakitandaan na ito ay simula pa lamang. Kapag nagpasya kang lumikha ng mga anotasyon, kakailanganin mong malaman kung paano gamitin ang mga ito sa pinakamabisang paraan. Sa Part 2, ipapakita ko sa iyo kung paano iproseso ang mga anotasyon gamit ang Java reflection. — Jonny Hackett, asktheteam@keyholesoftware.com orihinal na artikulo http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION