JavaRush /Blog Java /Random-MS /Mencipta anotasi anda sendiri dalam Java
angelina
Tahap

Mencipta anotasi anda sendiri dalam Java

Diterbitkan dalam kumpulan
artikel oleh Jonny Hackett 14 Julai 2014 11:09 pagi Jika anda memprogram dalam Java dan menggunakan mana-mana rangka kerja popular seperti Spring dan Hibernate , maka anda sudah biasa dengan penggunaan anotasi. Apabila bekerja dengan rangka kerja sedia ada, anotasi dalaman agak mencukupi. Tetapi bagaimana jika anda perlu membuat anotasi anda sendiri? Tidak lama dahulu saya mempunyai sebab untuk mencipta anotasi saya sendiri untuk projek yang memerlukan pengesahan maklumat biasa daripada beberapa pangkalan data. Senario Sebuah perniagaan mempunyai berbilang pangkalan data yang menyimpan maklumat yang sama dan mengemas kini data dalam cara yang berbeza. Ia telah dirancang untuk menggabungkan data ke dalam satu pangkalan data induk untuk menghapuskan masalah yang berkaitan dengan mendapatkan data daripada sumber yang berbeza. Tetapi sebelum memulakan projek, adalah perlu untuk mengetahui bagaimana data tidak disegerakkan dan membuat perubahan yang diperlukan. Langkah pertama ialah membuat laporan yang akan menunjukkan data yang sama dalam pangkalan data yang berbeza dan mengesahkan nilai, atau menyerlahkan rekod yang tidak sepadan, berdasarkan peraturan perdamaian yang ditetapkan. Di bawah ialah petikan keperluan utama pada masa projek: • Bandingkan data dalam beberapa pangkalan data untuk mencari data yang sama, seperti nama pelanggan, nama syarikat atau maklumat direktori. • Secara lalai, nilai harus betul-betul sama merentas semua pangkalan data berdasarkan jenis data. • Untuk sesetengah medan kami hanya mahu menunjukkan bahawa nilai telah ditemui, tetapi nilai itu tidak dibandingkan. • Untuk medan lain, kami hanya mahu membandingkan nilai dengan perkara yang ditemui dan mengesahkan data dengan data daripada sumber yang ditentukan. • Untuk medan ketiga, kami ingin membuat perbandingan data kompleks yang akan berdasarkan nilai medan lain dalam rekod. • Untuk jenis medan keempat, kami ingin memformat data, contohnya dalam format mata wang $000,000.00. • Laporan mestilah dalam format MS Excel, setiap baris hendaklah mengandungi nilai daripada sumber yang berasingan. Mana-mana baris yang nilainya tidak sepadan dengan syarat pengesahan data hendaklah diserlahkan dengan warna kuning. Аннотации После того, 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; Seperti yang anda lihat, kami telah menambahkan sedikit kelonggaran pada proses membandingkan data daripada pangkalan data yang berbeza dengan menggunakan dua anotasi yang agak mudah. Untuk kes khusus ini, anotasi mendorong proses perbandingan data, jadi pada asasnya kami menilai anotasi yang kami temui dalam data kongsi dan menggunakannya untuk membimbing pemprosesan. Kesimpulan Terdapat banyak artikel mengenai anotasi di Jawa, apa yang mereka lakukan dan apakah peraturan untuk menggunakannya. Dalam artikel ini saya ingin menunjukkan, melalui contoh, mengapa anda perlu menggunakannya dan bagaimana anda boleh mendapat manfaat daripadanya. Sila ambil perhatian bahawa ini hanyalah permulaan. Sebaik sahaja anda membuat keputusan untuk membuat anotasi, anda perlu memikirkan cara menggunakannya dengan cara yang paling berkesan. Dalam Bahagian 2, saya akan menunjukkan kepada anda cara memproses anotasi menggunakan refleksi Java. — Jonny Hackett, asktheteam@keyholesoftware.com artikel asal http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION