JavaRush /Java Blog /Random-KO /Java로 자신만의 주석 만들기
angelina
레벨 5

Java로 자신만의 주석 만들기

Random-KO 그룹에 게시되었습니다
Jonny Hackett의 기사 2014년 7월 14일 오전 11:09 Java로 프로그래밍하고 SpringHibernate 와 같은 널리 사용되는 프레임워크를 사용하는 경우 이미 주석 사용에 익숙합니다. 기존 프레임워크로 작업할 때는 내부 주석으로 충분합니다. 하지만 자신만의 주석을 작성해야 한다면 어떻게 해야 할까요? 얼마 전 나는 여러 데이터베이스의 공통 정보를 확인해야 하는 프로젝트에 대한 주석을 직접 작성해야 할 이유가 있었습니다. 시나리오 한 기업에는 동일한 정보를 저장하고 다양한 방식으로 데이터를 업데이트하는 여러 데이터베이스가 있습니다. 다양한 소스에서 데이터를 얻는 것과 관련된 문제를 제거하기 위해 데이터를 하나의 마스터 데이터베이스로 결합할 계획이었습니다. 하지만 프로젝트를 시작하기 전에 데이터가 얼마나 동기화되지 않았는지 확인하고 필요한 변경을 수행해야 했습니다. 첫 번째 단계는 설정된 조정 규칙에 따라 서로 다른 데이터베이스의 동일한 데이터를 표시하고 값을 확인하거나 일치하지 않는 레코드를 강조 표시하는 보고서를 만드는 것이었습니다. 다음은 프로젝트 당시 주요 요구 사항을 발췌한 것입니다. • 고객 이름, 회사 이름 또는 디렉토리 정보와 같은 동일한 데이터를 찾기 위해 여러 데이터베이스의 데이터를 비교합니다. • 기본적으로 값은 데이터 유형을 기반으로 모든 데이터베이스에서 정확히 동일해야 합니다. • 일부 필드의 경우 값이 발견되었음을 표시하고 싶었지만 값이 비교되지 않았습니다. • 다른 필드의 경우 값을 찾은 값과 비교하고 지정된 소스의 데이터로 데이터를 확인하고 싶었습니다. • 세 번째 필드의 경우 레코드 내의 다른 필드 값을 기반으로 하는 복잡한 데이터 비교를 원했습니다. • 네 번째 필드 유형의 경우 데이터 형식을 $000,000.00라는 통화 형식으로 지정하려고 했습니다. • 보고서는 MS Excel 형식이어야 하며 각 행에는 별도 소스의 값이 포함되어야 합니다. 값이 데이터 확인 조건과 일치하지 않는 라인은 노란색으로 강조 표시되어야 합니다. Аннотации После того, 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; 보시다시피, 우리는 매우 간단한 두 가지 주석을 사용하여 서로 다른 데이터베이스의 데이터를 비교하는 프로세스에 유연성을 추가했습니다. 이 특정 사례의 경우 주석은 데이터 비교 프로세스를 주도하므로 기본적으로 공유 데이터에서 찾은 주석을 평가하고 처리를 안내하는 데 사용합니다. 결론 Java의 주석, 주석의 기능, 주석 사용 규칙에 대한 많은 기사가 있습니다. 이 기사에서는 예제를 통해 왜 이를 사용해야 하는지, 그리고 이를 통해 어떤 이점을 얻을 수 있는지 보여주고 싶었습니다. 이는 시작에 불과하다는 점을 참고하시기 바랍니다. 주석을 만들기로 결정한 후에는 주석을 가장 효과적인 방법으로 사용하는 방법을 찾아야 합니다. 2부에서는 Java 리플렉션을 사용하여 주석을 처리하는 방법을 보여 드리겠습니다. — Jonny Hackett, 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