2012-04-25 2 views
2

私は、さまざまな修正バージョン(4.2,4.3,4.4)を扱ういくつかのコードを書いています。 私が持っている問題は、ハンドラオブジェクトを書くときに、それぞれの修正バージョンが異なるハンドラを使用するため、コードを複製することが強制されていることです。例: 異なる修正バージョンのQuickfix重複コード

@Handler  
public void executionHandler(quickfix.fix42.ExecutionReport execution, SessionID sessionID) { 
    System.out.println(execution.getClOrdID().getValue()); 
} 

@Handler  
public void executionHandler(quickfix.fix43.ExecutionReport execution, SessionID sessionID) { 
    System.out.println(execution.getClOrdID().getValue()); 
} 

私が書いている実際のコードははるかに複雑です(私はいくつかのフィールドを取得し、データを操作しています)。私は反射に頼らずにこの重複を減らす方法を考えることができません。

+0

フィールドは同じで、パッケージが異なるだけです(つまり、「fix42'、 'fix43')? –

+0

はい正確に.... –

+0

あなたの操作には多くのフィールドがありますか?そうでない場合は、上記のように異なるバージョンをキャッチして、フィールドを中央のプライベートメソッドに渡して計算します。 –

答えて

1

皮肉なことに、QuickFIX/Jを使いやすくて安全にする機能のいくつかは、あなたが説明しているような状況でも問題を引き起こす可能性があります。ハンドラメソッドと生成されたメッセージクラスは型の安全性をサポートするように設計されていますが、実際には型の安全性が低く、動的なフィールドアクセスが必要です。生成されたクラスは、サブクラスがquickfix.FieldMapquickfix.Messageのサブクラスです。 FieldMapクラスには、フィールドデータを取得するためのパブリックアクセサがあります。型保証メッセージラッパーは、これらを使用してメッセージデータを取得します。

例えば、

double averagePrice = message.getDouble(AvgPx.FIELD);

これは、フィールドを含むすべてのメッセージのために動作します。生成されたすべてのフィールドには、タグ番号を持つFIELDの静的メンバーがあります。 quickfix.MsgTypeクラスには、メッセージのカスタム動的ディスパッチに便利なメッセージタイプの定数もあります。

MsgTypeなどのメッセージヘッダーフィールドにアクセスする場合は、message.getHeader()メソッドを使用してこれらのフィールドにアクセスしてください。

ここにボーナスチップがあります。型安全なメッセージラッパーが必要ない場合、基本的なquickfix.Messageオブジェクトを作成する単純なカスタムquickfix.MessageFactoryを定義することができます。これにより、受信メッセージを処理する際のパフォーマンスが少し向上します。

関連する問題