2016-07-18 19 views
1

いくつかの.xsdがあり、JAXBでクラスを生成したいと思います。同じクラスの異なるパッケージとJAXB

Package: v1 
Class: JBObject 
Class: ... 

Package: v2 
Class JBObject 
Class: ... 

それは私がV1のクラスを使用して、それがV2だ場合、私はV2のクラスを使用V1だ場合、私は、工場出荷時のパターンを使用しています。 バージョンでは、パッケージ1のクラスを使用する必要があり、他のバージョンでは、パッケージ2のクラスを使用する必要があります。 生成されるクラスは同じか、ほぼ同じです。

私はこの方法で翻訳と呼ばれる他のクラスを持っている:

import XX.JBObject; 
public void translate(JBObject object) 
{ 
    ... 
    String name = object.getName(); 
    JBRelationObject relationObject = object.getRelationObject(); 
    int id = relationObject.getId(); 
    ... 
} 

JBObjectはv1とv2で同じクラスですが(私はクラスにインポートする必要があり、私は二回コピー&ペーストする必要はありません1つ1つずつ) どうすれば解決できますか?

インポート時の意味は次のとおりです。import v1.JBObject;またはv2.JBObjectをインポートします。

+0

メソッドを「インポートする」とはどういう意味ですか? – Andreas

+0

import v1.JBObject;またはv2.JBObjectをインポートします。 – Regular

+0

これは* classes *のインポートです。あなたは "*メソッド*' translate'でインポートしなければならないと言ったが、これは意味をなさない。 'translate'メソッドの2つのバージョンを作成せずに、' Translation'クラスの 'translate'メソッドを' JBObject'のどちらのバージョンでも動作させたいと言っていますか? – Andreas

答えて

0

あなたはいくつかの選択肢があります。

オプション1:JBObjectクラスは両方とも同じインターフェイスを実装します。
これらは生成されているので、おそらくそれはできません。

オプション2:共通インターフェイスを実装するアダプタクラスでラップします。
複数の場所で共有ロジックが必要な場合に便利です。

オプション3:あなたtranslate()方法が必要とするすべてのJBObject.getName()ある場合は、名前を取得し、共通のコードに委譲、例えば

public void translate(v1.JBObject jb1obj) { 
    translate(jb1obj.getName()); 
} 
public void translate(v2.JBObject jb2obj) { 
    translate(jb2obj.getName()); 
} 
private void translate(String name) { 
    // common logic here 
} 

いいえimportステートメント。あなたのコードは両方のバージョンを単一のクラスで扱います。

+0

私はgetName以上のものを持っています。私はオプション2が好きですが、問題は私が+/- 100クラスを持っているので、たくさんのインターフェースを作成しなければならないということです(私は他のオブジェクトと翻訳するようなメソッドがたくさんあります)。ありがとうございました。 – Regular

+0

そして私にはJBObjectのようなオブジェクトがたくさんあります。たとえば、JBObjectではJBRelationObject getJBRelationObjet()とsetJBRelationObject(JBRelationObject relationObject)があるので、どうすればそのような場合にインタフェースを実行できますか? – Regular

関連する問題