JavaRush /Java Blog /Random-JA /Java で独自のアノテーションを作成する
angelina
レベル 5

Java で独自のアノテーションを作成する

Random-JA グループに公開済み
Jonny Hackett による記事 2014 年 7 月 14 日 11:09午前 Java でプログラミングし、 SpringHibernate などの一般的なフレームワークを使用している場合は、アノテーションの使用にすでに慣れているでしょう。既存のフレームワークを使用する場合は、内部アノテーションで十分です。しかし、独自の注釈を作成する必要がある場合はどうすればよいでしょうか? 少し前まで、いくつかのデータベースから共通の情報を確認する必要があるプロジェクトのために独自のアノテーションを作成する理由がありました。シナリオ ある企業には、同じ情報を保存し、異なる方法でデータを更新する複数のデータベースがありました。さまざまなソースからのデータ取得に伴う問題を解決するために、データを 1 つのマスター データベースに結合することが計画されました。ただし、プロジェクトを開始する前に、データの同期がどの程度ずれているかを調べ、必要な変更を加える必要がありました。最初のステップは、確立された調整ルールに基づいて、異なるデータベース内の同じデータを表示して値を確認するか、一致しないレコードを強調表示するレポートを作成することでした。以下は、プロジェクト時の主な要件の抜粋です。 • 複数のデータベースのデータを比較して、顧客名、会社名、ディレクトリ情報など、同じデータを見つけます。• デフォルトでは、値はデータ型に基づいてすべてのデータベースでまったく同じである必要があります。• 一部のフィールドでは、値が見つかったことのみを示したいが、値は比較されませんでした。• 他のフィールドについては、見つかった値と値を比較し、指定されたソースからのデータとデータを確認するだけでした。• 3 番目のフィールドでは、レコード内の他のフィールドの値に基づく複雑なデータ比較を行いたいと考えました。• 4 番目のフィールド タイプでは、データをたとえば通貨形式 $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 です。注釈は RUNTIME で処理するため、これらの値を設定する必要があります。データ検証プロセスでは、各データベースに対して 1 つのクエリが実行され、データ全体 (特定のレコード タイプのすべてのフィールド) に結果が表示されます。共有データの各フィールドの注釈は、その特定のフィールドのデータと各データベースで見つかった値を比較する方法をプロセッサに指示します。これらのアノテーションをさまざまなデータ比較構成に使用する方法の例をいくつか見てみましょう。各データ ソースに値が存在し、正確に一致していることを確認するには、レポート フィールドに表示されるフィールド 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; 基本的な要件は満たしたので、次はフィールド固有のより複雑なデータ比較を実行する必要があります。これを行うために、ルール処理をトリガーする 2 番目のアノテーションを作成します。 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 } 前のアノテーションとよく似ていますが、大きな違いの 1 つは、 @ReconCustomRuleで、偵察プロセスの開始時にデータ比較を実行するクラスを指定していることです。使用するクラスのみを指定できるため、ハンドラーは値を割り当て、指定したクラスを初期化します。このアノテーションで指定されたクラスはルール インターフェイスを使用し、ハンドラーはこのインターフェイスを使用してルールを実行します。このアノテーションの例をいくつか見てみましょう。この例では、米国以外の通貨交換をチェックするルールを使用しており、この場合はデータ比較をスキップします。これを行うには、同じレコードの国フィールドをチェックする必要があります。 1 @ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false) 2 @ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class) 3 private String streetCusip; 以下は、ルールのパラメーター (この場合は許容値) を設定する例です。データを比較する場合、比較値の差異は 1,000 を超えてはなりません。パラメーターを使用して許容値を指定すると、異なる許容値を使用して複数のフィールドに同じルールを使用できるようになります。唯一の問題は、これらのパラメータが静的であり、アノテーションの性質上、動的にできないことです。 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; ご覧のとおり、2 つの非常に単純な注釈を使用することで、異なるデータベースのデータを比較するプロセスに柔軟性を加えました。この特定のケースでは、注釈がデータ比較プロセスを推進するため、基本的に共有データ内で見つかった注釈を評価し、それを処理のガイドに使用します。結論 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