JavaRush /Blog Java /Random-VI /Tạo chú thích của riêng bạn trong Java
angelina
Mức độ

Tạo chú thích của riêng bạn trong Java

Xuất bản trong nhóm
bài viết của Jonny Hackett ngày 14 tháng 7 năm 2014 11:09 sáng Nếu bạn lập trình bằng Java và sử dụng bất kỳ framework phổ biến nào như SpringHibernate thì bạn đã quen với việc sử dụng chú thích. Khi làm việc với một khung hiện có, các chú thích nội bộ là khá đủ. Nhưng nếu bạn cần tạo chú thích của riêng mình thì sao? Cách đây không lâu, tôi có lý do để tạo chú thích của riêng mình cho một dự án yêu cầu xác nhận thông tin chung từ một số cơ sở dữ liệu. Tình huống Một doanh nghiệp có nhiều cơ sở dữ liệu lưu trữ cùng một thông tin và cập nhật dữ liệu theo nhiều cách khác nhau. Người ta đã lên kế hoạch kết hợp dữ liệu vào một cơ sở dữ liệu chính để loại bỏ các vấn đề liên quan đến việc lấy dữ liệu từ các nguồn khác nhau. Nhưng trước khi bắt đầu dự án, cần phải tìm hiểu xem dữ liệu không đồng bộ như thế nào và thực hiện những thay đổi cần thiết. Bước đầu tiên là tạo một báo cáo hiển thị cùng một dữ liệu trong các cơ sở dữ liệu khác nhau và xác nhận các giá trị hoặc đánh dấu những bản ghi không khớp, dựa trên các quy tắc đối chiếu đã thiết lập. Dưới đây là đoạn trích các yêu cầu chính tại thời điểm thực hiện dự án: • So sánh dữ liệu trong một số cơ sở dữ liệu để tìm cùng một dữ liệu, chẳng hạn như tên khách hàng, tên công ty hoặc thông tin thư mục. • Theo mặc định, giá trị phải giống hệt nhau trên tất cả các cơ sở dữ liệu dựa trên kiểu dữ liệu. • Đối với một số trường, chúng tôi chỉ muốn hiển thị rằng giá trị đã được tìm thấy chứ không phải giá trị được so sánh. • Đối với các trường khác, chúng tôi chỉ muốn so sánh giá trị với những gì được tìm thấy và xác nhận dữ liệu với dữ liệu từ nguồn được chỉ định. • Đối với trường thứ ba, chúng tôi muốn thực hiện so sánh dữ liệu phức tạp dựa trên giá trị của các trường khác trong bản ghi. • Đối với loại trường thứ tư, chúng tôi muốn định dạng dữ liệu, ví dụ ở định dạng tiền tệ $000.000,00. • Báo cáo phải ở định dạng MS Excel, mỗi hàng phải chứa một giá trị từ một nguồn riêng biệt. Bất kỳ dòng nào có giá trị không khớp với điều kiện xác nhận dữ liệu sẽ được tô sáng màu vàng. Chú thích Sau khi chúng tôi đọc các yêu cầu và đưa ra một số ý tưởng khác nhau về những gì được yêu cầu, tôi quyết định sử dụng các chú thích sẽ kích hoạt quá trình báo cáo và cấu hình so sánh dữ liệu. Chúng tôi cần một giải pháp đơn giản nhưng linh hoạt và có thể mở rộng. Các chú thích này sẽ ở cấp trường và tôi thích thực tế là cấu hình sẽ không bị ẩn trong một tệp ở đâu đó trên đường dẫn lớp. Thay vào đó, tôi có thể xem các chú thích liên quan đến trường này để biết chính xác nó sẽ được xử lý như thế nào. Nói một cách đơn giản, chú thích sẽ không gì khác hơn là một điểm đánh dấu, siêu dữ liệu sẽ cung cấp thông tin nhưng sẽ không ảnh hưởng trực tiếp đến hoạt động của chính mã đó. Nếu trước đây bạn đã lập trình bằng Java thì bạn nên làm quen với việc sử dụng các chú thích, nhưng có thể bạn chưa bao giờ cần tạo chú thích của riêng mình. Để thực hiện việc này, bạn cần tạo một loại mới sử dụng loại @interface Java , loại này sẽ chứa các phần tử xác định chi tiết siêu dữ liệu. Đây là một ví dụ về một dự án: 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 } Đây là chú thích chính để bắt đầu quá trình so sánh dữ liệu. Nó chứa các phần tử cơ bản cần thiết, theo yêu cầu, để so sánh dữ liệu từ các nguồn dữ liệu khác nhau. @ReconField sẽ xử lý hầu hết những gì chúng ta cần, ngoại trừ những so sánh dữ liệu phức tạp hơn mà chúng ta sẽ nói đến sau. Hầu hết các yếu tố này được giải thích bằng các nhận xét trong mã. Bất chấp điều đó, một số chú thích chính trong @ReconField của chúng tôi cần được giải thích riêng. • @Target – Chú thích này sẽ cho phép bạn chỉ định các phần tử java mà chú thích sẽ được áp dụng. Các loại có thể sử dụng là: ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER và TYPE. Trong chú thích @ReconField của chúng tôi cho cấp FIELD. • @Retention – Chú thích này sẽ cho phép bạn chỉ định khi nào chú thích sẽ có sẵn. Các giá trị có thể có là LỚP, RUNTIME và SOURCE. Vì chúng ta sẽ xử lý các chú thích trong RUNTIME nên chúng ta phải đặt các giá trị này. Quá trình xác thực dữ liệu sẽ chạy một truy vấn đối với từng cơ sở dữ liệu, sau đó hiển thị kết quả trong dữ liệu tổng thể, đó là tất cả các trường cho một loại bản ghi cụ thể. Chú thích cho từng trường trong dữ liệu được chia sẻ sẽ cho bộ xử lý biết cách so sánh dữ liệu cho trường cụ thể đó cũng như giá trị được tìm thấy trong mỗi cơ sở dữ liệu. Hãy xem một số ví dụ về cách sử dụng các chú thích này cho các cấu hình so sánh dữ liệu khác nhau. Để xác nhận rằng giá trị tồn tại và khớp chính xác trong từng nguồn dữ liệu, bạn chỉ cần cung cấp ID trường và nhãn sẽ xuất hiện trong trường báo cáo. 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; Để hiển thị các giá trị tìm thấy từ mỗi nguồn dữ liệu nhưng thực hiện so sánh dữ liệu, bạn cần chỉ định phần tử so sánh và đặt giá trị thành sai. 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; Để xác nhận rằng một giá trị được tìm thấy trong một nguồn dữ liệu nhất định chứ không phải tất cả, bạn cần sử dụng phần tử nguồnToCompare . Điều này sẽ hiển thị tất cả các giá trị tìm thấy nhưng mọi so sánh dữ liệu trong nguồn dữ liệu sẽ được thực hiện theo danh sách các phần tử. Điều này dành cho trường hợp một số dữ liệu không được lưu trong tất cả các nguồn dữ liệu. ReconSource là một enum trong đó các nguồn dữ liệu có sẵn để so sánh. 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; Bây giờ chúng ta đã đáp ứng các yêu cầu cơ bản, chúng ta cần thực hiện các so sánh dữ liệu phức tạp hơn theo từng trường cụ thể. Để làm điều này, chúng tôi sẽ tạo chú thích thứ hai để kích hoạt quá trình xử lý quy tắc. 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 } Rất giống với chú thích trước đó, một điểm khác biệt lớn là trong @ReconCustomRule , chúng tôi chỉ định một lớp sẽ chạy so sánh dữ liệu khi quá trình điều chỉnh lại bắt đầu. Bạn chỉ có thể chỉ định lớp sẽ được sử dụng để trình xử lý của bạn sẽ gán một giá trị và khởi tạo bất kỳ lớp nào bạn chỉ định. Lớp được chỉ định trong chú thích này sẽ sử dụng giao diện quy tắc, giao diện này sẽ được trình xử lý sử dụng để thực thi quy tắc. Hãy xem xét một vài ví dụ về chú thích này. Trong ví dụ này, chúng tôi đang sử dụng quy tắc sẽ kiểm tra các sàn giao dịch tiền tệ không phải của Hoa Kỳ và sẽ bỏ qua việc so sánh dữ liệu trong trường hợp này. Để làm điều này, chúng ta cần kiểm tra trường quốc gia trong cùng một bản ghi. 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; Đây là một ví dụ trong đó chúng tôi đặt các tham số của quy tắc, trong trường hợp này là giá trị dung sai. Để so sánh dữ liệu của chúng tôi, giá trị so sánh không thể sai lệch quá 1.000. Việc sử dụng một tham số để chỉ định giá trị dung sai sẽ cho phép chúng ta sử dụng cùng một quy tắc cho một số trường với các giá trị dung sai khác nhau. Vấn đề duy nhất là các tham số này là tĩnh và không thể động do tính chất của chú thích. 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; Như bạn có thể thấy, chúng tôi đã bổ sung tính linh hoạt cho quy trình so sánh dữ liệu từ các cơ sở dữ liệu khác nhau bằng cách sử dụng hai chú thích khá đơn giản. Đối với trường hợp cụ thể này, các chú thích thúc đẩy quá trình so sánh dữ liệu, do đó về cơ bản chúng tôi đánh giá các chú thích mà chúng tôi tìm thấy trong dữ liệu được chia sẻ và sử dụng chúng để hướng dẫn xử lý. Kết luận Có rất nhiều bài viết về các chú thích trong Java, chúng làm gì và các quy tắc sử dụng chúng là gì. Trong bài viết này, tôi muốn chỉ ra, thông qua các ví dụ, tại sao bạn nên sử dụng chúng và bạn có thể hưởng lợi từ nó như thế nào. Xin lưu ý rằng đây chỉ là sự khởi đầu. Khi quyết định tạo chú thích, bạn sẽ phải tìm ra cách sử dụng chúng một cách hiệu quả nhất. Trong Phần 2, tôi sẽ hướng dẫn bạn cách xử lý các chú thích bằng cách sử dụng phản chiếu Java. — Jonny Hackett, bài viết gốc của Asktheteam@keyholesoftware.com http://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION