JavaRush /Blog Java /Random-ES /Creando tus propias anotaciones en Java
angelina
Nivel 5

Creando tus propias anotaciones en Java

Publicado en el grupo Random-ES
artículo de Jonny Hackett 14 de julio de 2014 11:09 am Si programa en Java y utiliza cualquiera de los marcos populares como Spring e Hibernate , entonces ya está familiarizado con el uso de anotaciones. Cuando se trabaja con un marco existente, las anotaciones internas son más que suficientes. Pero ¿qué pasa si necesitas crear tus propias anotaciones? No hace mucho tuve una razón para crear mis propias anotaciones para un proyecto que requería confirmación de información común de varias bases de datos. Escenario Una empresa tenía varias bases de datos que almacenaban la misma información y actualizaban los datos de diferentes maneras. Se planeó combinar los datos en una base de datos maestra para eliminar los problemas asociados con la obtención de datos de diferentes fuentes. Pero antes de comenzar el proyecto, era necesario averiguar qué tan desincronizados estaban los datos y realizar los cambios necesarios. El primer paso fue crear un informe que mostrara los mismos datos en diferentes bases de datos y confirmara los valores, o resaltara aquellos registros que no coincidieran, según las reglas de conciliación establecidas. A continuación se muestra un extracto de los principales requisitos al momento del proyecto: • Comparar datos en varias bases de datos para encontrar los mismos datos, como nombre del cliente, nombre de la empresa o información del directorio. • De forma predeterminada, el valor debe ser exactamente el mismo en todas las bases de datos según el tipo de datos. • Para algunos campos solo queríamos mostrar que se encontró el valor, pero el valor no se comparó. • Para otros campos, sólo queríamos comparar el valor con lo que se encontró y confirmar los datos con los datos de la fuente especificada. • Para los terceros campos, queríamos hacer una comparación de datos compleja que se basaría en el valor de otros campos dentro del registro. • Para el cuarto tipo de campo, queríamos formatear los datos, por ejemplo en el formato de moneda $000.000,00. • El informe tenía que estar en formato MS Excel y cada fila debía contener un valor de una fuente independiente. Cualquier línea cuyo valor no coincida con las condiciones de confirmación de datos debe resaltarse en amarillo. Аннотации После того, Cómo мы прочитали требования и озвучo несколько разных идей воплощения того, что требуется, я решил использовать аннотации, которые запустят конфигурацию сравнения данных и процесс отчета. Нам требовалось просто, но гибкое и расширяемое решение. Эти аннотации будут на уровне поля и мне понравилось то, что конфигурацию не будет скрыта в файле, где-нибудь в пути класса. Вместо этого я смогу видеть аннотации ассоциированные с полем, чтобы точно знать Cómo оно будет обработано. Проще говоря - anotación будет ничем иным Cómo маркером, метаданные которая будет предоставлять информацию, но не будет напрямую воздействовать на работу самого códigoа. Если вы уже программировали на Java, то вам должно быть знакомо использования anotación, но возможно вам никогда не требовалось создавать свои собственные. Для этого вам нужно создать новый тип, который использует Java тип @interface, который будет содержать элементы, которые в свою очередь определяют детали метаданных. Вот пример проекта: 1@Target(ElementType.FIELD) 2@Retention(RetentionPolicy.RUNTIME) 3public @interface ReconField { 4 5 /** 6 * Значение, которое определяет из Cómoого источника сравниваются данные, o будет использоваться для 7 отображения значения o для ссылки на правило. 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 * Значение, показывающее significado 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 } Это основная anotación, с помощью которой запуститься процесс сравнения данных. Она содержит основные требуемые элементы, в соответствии с требованиями, для сравнения данных из различных источников данных. @ReconField должна справиться с большинством того, что нам требуется, за исключением более сложных сравнений данных, о которых мы поговорим позже. Большинство из этих элементов объяснены комментариями в códigoе. Не смотря на это пара основных аннотаций в нашей @ReconField должны быть объяснены отдельно. • @Target – Эта anotación позволит вам указать те java элементы, к которой anotación должна быть применена. Возможные типы для применения такие: ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER и TYPE. В нашей @ReconField anotación для уровня FIELD. • @Retention – Эта anotación позволит вам указать, когда anotación будет доступна. Возможные значения: CLASS, RUNTIME и SOURCE. Так Cómo мы будет обрабатывать аннотации в RUNTIME, мы должны установить эти значения. Процесс подтверждения данных будет идти в один pedido к каждой базе данных, и затем отобразит результаты в общих данных, которые представляют собой все поля для определенного типа записи. Аннотация для каждого поля в общих данных сообщит процессору Cómo совершать сравнение данных для этого определенного поля, а так же significado, найденное в каждой базе данных. Давайте посмотрим на несколько примеров того, Cómo эти аннотации могу быть использованы для различных конфигураций сравнения данных. Quéбы подтвердить, что significado существует и точно соответствует в каждом источнике данных, вам всего лишь надо предоставить ID поля и ярлык, который будет отображаться в поле отчета. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Quéбы отобразить найденные значения из каждого источника данных, но делать сравнения данных, вам нужно указать элемент compareSources и поставить significado на false. 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; Quéбы подтвердить, что significado найдено в определенном источник данных, но не во всех, вам нужно использовать элемент sourcesToCompare. Это отобразить все найденные значения, но сравнение любых данных в источниках данных произойдет в соответствии со списком элементов. Это для случая, если некоторые данные не сохранены во всех источниках данных. ReconSource - это enum, в котором источники данных доступны для сравнения. 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; Теперь, когда мы выполнo основные требования, нам нужно выполнить сравнение более сложных данных, которые специфичный для поля. Quéбы сделать это мы создадим вторую аннотацию, которая запустит обработку правил. 1 @Target(ElementType.FIELD) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface ReconCustomRule { 4 5 /** 6 * Значение, указывающее используемые параметры, прописанные обработчику правила, significado по умолчанию - 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. Вы можете указать только класс, который будет использован, чтобы ваш обработчик приписал significado и инициализировал любой класс, который вы укажите. Указанный класс в данной аннотации, будет использовать интерфейс правила, который в свою очередь будет использован обработчиком для исполнения правила. Давайте посмотрим пару примеров данной аннотации. В этом примере мы используем правило, которое проверит обмен валюты не в США и в этом случае пропустит сравнение данных. Quéбы сделать это, нам надо проверить поле страны в той же записи. 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; Вот пример, в котором мы задаем параметры правила, в данном случае significado допустимого отклонения. Для сравнения наших данных, сравниваемое significado не может отклоняться более чем на 1,000. Используя параметр для указания значения отклонения позволит нам использовать то же правила для нескольких полей, с разным significadoм допустимого отклонения. Единственная проблема в том, что эти параметры статические и не могут быть динамическими по причине природы аннотации. 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; Como puede ver, hemos agregado cierta flexibilidad al proceso de comparar datos de diferentes bases de datos mediante el uso de dos anotaciones bastante simples. Para este caso particular, las anotaciones impulsan el proceso de comparación de datos, de modo que esencialmente evaluamos las anotaciones que encontramos en los datos compartidos y las utilizamos para guiar el procesamiento. Conclusión Hay muchos artículos sobre anotaciones en Java, qué hacen y cuáles son las reglas para usarlas. En este artículo quería mostrar, a través de ejemplos, por qué deberías usarlos y cómo puedes beneficiarte de ello. Tenga en cuenta que esto es sólo el comienzo. Una vez que decida crear anotaciones, tendrá que descubrir cómo utilizarlas de la manera más eficaz. En la Parte 2, le mostraré cómo procesar anotaciones utilizando la reflexión de Java. — Jonny Hackett, Asktheteam@keyholesoftware.com artículo original http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION