JavaRush /Java Blog /Random-TW /在 Java 中建立您自己的註釋
angelina
等級 5

在 Java 中建立您自己的註釋

在 Random-TW 群組發布
文章作者:Jonny Hackett 2014 年 7 月 14 日 上午 11:09 如果您使用 Java 編程並使用任何流行的框架(例如SpringHibernate),那麼您已經熟悉註釋的使用。當使用現有框架時,內部註釋就足夠了。但是如果您需要建立自己的註釋怎麼辦?不久前,我有理由為一個需要確認多個資料庫中的公共資訊的專案建立自己的註釋。場景 一家企業擁有多個資料庫,這些資料庫儲存相同的資訊並以不同的方式更新資料。計劃將這些資料合併到一個主資料庫中,以消除從不同來源取得資料所帶來的問題。但在專案開始之前,有必要找出資料不同步的程度並進行必要的變更。第一步是建立一個報告,該報告將顯示不同資料庫中的相同數據並根據既定的對帳規則確認這些值,或突出顯示那些不匹配的記錄。以下是該專案當時主要需求的摘錄: • 比較多個資料庫中的數據以查找相同的數據,例如客戶名稱、公司名稱或目錄資訊。• 預設情況下,根據資料類型,該值在所有資料庫中應該完全相同。• 對於某些字段,我們只想顯示已找到該值,但不比較該值。• 對於其他字段,我們只想將值與找到的值進行比較,並與指定來源的資料確認資料。• 對於第三個字段,我們希望基於記錄中其他字段的值進行複雜的資料比較。• 對於第四種欄位類型,我們希望對資料進行格式化,例如採用貨幣格式$000,000.00。• 報表必須採用MS Excel 格式,每行應包含來自單獨來源的值。任何其值與資料確認條件不符的行都應以黃色突出顯示。 註釋在我們閱讀了需求並針對所需內容提出了一些不同的想法後,我決定使用註釋來觸發資料比較配置和報告過程。我們需要一個簡單但靈活且可擴展的解決方案。這些註釋將位於字段級別,我喜歡這樣的事實:配置不會隱藏在類路徑上某處的文件中。相反,我將能夠看到與該欄位關聯的註釋,因此我確切地知道它將如何處理。簡單地說,註解只不過是一個標記,是提供資訊的元數據,但不會直接影響程式碼本身的操作。如果您以前使用過 Java 編程,您應該熟悉使用註釋,但您可能從來不需要建立自己的註釋。為此,您需要建立一個使用 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 } 這是啟動資料比較過程的主要註釋。它根據需要包含用於比較來自不同資料來源的資料的基本必要元素。 @ReconField應該處理我們需要的大部分內容,除了更複雜的數據比較,我們將在稍後討論。大多數這些元素都透過程式碼中的註解進行了解釋。 無論如何, @ReconField中的幾個主要註釋需要單獨解釋。• @Target – 此註解將允許您指定應套用該註解的java 元素。可能使用的類型有:ANNOTATION_TYPE、CONSTRUCTOR、FIELD、LOCAL_VARIABLE、METHOD、PACKAGE、PARAMETER 和 TYPE。在我們的Field 層級的 @ReconField註釋中。@Retention – 此註解將允許您指定註解何時可用。可能的值為 CLASS、RUNTIME 和 SOURCE。由於我們將在運行時處理註釋,因此必須設定這些值。資料驗證過程將對每個資料庫執行一個查詢,然後在整體資料(即特定記錄類型的所有欄位)中顯示結果。共享資料中每個欄位的註釋將告訴處理器如何比較該特定欄位的資料以及每個資料庫中找到的值。讓我們來看幾個範例,了解如何將這些註解用於各種資料比較配置。若要確認每個資料來源中存在值且完全匹配,您只需提供欄位 ID 和將出現在報表欄位中的標籤。 1 @ReconField(id = CUSTOMER_ID, label = "Customer ID") 2 private String customerId; 要顯示從每個資料來源找到的值,但進行資料比較,需要指定一個compareSources元素並將值設為false。 1 @ReconField(id = NAME, label = "NAME", compareSources = false) 2 private String name; 若要確認在某個資料來源(但不是全部)中找到某個值,您需要使用 sourcesToCompare元素。這將顯示所有找到的值,但資料來源中的任何資料比較都將根據元素清單進行。這是針對某些資料未保存在所有資料來源中的情況。 ReconSource是一個枚舉,其中的資料來源可用於比較。 1 @ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ 2 ReconSource.LEGACY, ReconSource.PACE }) private String privatePlacementFlag; 現在我們已經滿足了基本要求,我們需要執行更複雜的特定於欄位的資料比較。為此,我們將建立第二個註解來觸發規則處理。 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中,我們指定了一個類,該類將在偵察過程開始時運行資料比較。您只能指定將使用的類,以便您的處理程序將分配一個值並初始化您指定的任何類。此註解中指定的類別將使用規則接口,而處理程序將使用該接口來執行規則。讓我們看一下此註釋的幾個範例。在此範例中,我們使用的規則將檢查非美國貨幣兌換,並在這種情況下跳過資料比較。為此,我們需要檢查同一記錄中的國家/地區欄位。 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; 這是我們設定規則參數的範例,在本例中為容差值。比較我們的數據,比較值的偏差不能超過1000。使用參數指定容差值將允許我們對多個欄位使用相同的規則,但具有不同的容差值。唯一的問題是,由於註解的性質,這些參數是靜態的,不能是動態的。 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