0

まず第一に、Java のインターフェースでコンストラクターを定義することはできないことを知っています。しかし、どういうわけか、非常に似たものが必要な問題に遭遇しました。私の場合、簡単な解決策があるかもしれません...

私はインターフェースを持っています:

public interface SomeObject {

    /**
     * Generate a xml representation of the object.
     */
    public String generateXMLRepresentation();

}

このオブジェクトの xml 表現はどこかに保存され、後でこの xml 表現を使用してオブジェクトのコピーを作成できるようになります。私の最初の考えは、文字列を入力として受け取るコンストラクターを定義し、SomeObject のすべての実装がそれを処理する方法と対応するオブジェクトを構築する方法を知ることでした。

どうすればこれを達成できますか?

編集:私はそれについて十分に明確ではなかったか、間違った方法で考えていましたが、Factory または Builder パターンは機能しないと思います。誰もが SomeObject の新しい実装を記述でき、xml 文字列を受け取るコンストラクターを実装する必要がある、より強力なものが必要です。別の言い方をすれば、私は SomeObject の実装がいくつ存在するか、またはどの実装が存在するかを知りませんが、それでも、すべての実装が xml 表現からそれ自体を構築する方法を知っていることに依存しています。

4

3 に答える 3

0

一部のデザイン パターンは、現在のコンテキストを処理できるソリューションを定義するのに役立ちます。Abstract FactoryBuilderパターンの両方が役に立ちます。

Builder デザイン パターンを使用したいと思います。適切なロジックを実装することにより、単純なオブジェクトから複雑なオブジェクトまで、XML 表現のみに基づいて構築できるようになります。

于 2013-04-23T16:30:10.210 に答える
0

xml シリアライゼーションの懸念を、オブジェクトが扱っている懸念から切り離すことを検討する必要があると思います。to および from xml の知識は、クラスのドメインに本当に固有のものですか、それとも直交する懸念事項ですか?

http://x-stream.github.io/をご覧ください

jar に依存できないため、または xml フォームがプロジェクトに固有であるため、xstream 自体を使用したくない場合は、少なくとも xstream の機能を確認してください。オブジェクト構造を (反射的に?) 再帰し、必要な形式で xml を書き出すための単一の戦略と、反対のことを行うためのコンパニオン クラスを定義できる必要があります。

于 2013-04-23T16:30:23.453 に答える
0

文字列に基づいてオブジェクトを構築することについて話しているので、これにはFactory パターンを使用する必要があると思います。

そのため、特定の文字列に対してさまざまな実装を構築するさまざまな静的メソッドが必要です。

public class ObjV1 implements SomeObject(){ // objects would simply extend interface
    ...
}

public class SomeObjectFactory{// factory would provide construction methods for different implementations of the interface

   //Hide factory constructor, so we use it only as a singleton
   private SomeObjectFactory(){
   }

   public static ObjV1 buildV1(String str){
      ObjV1 obj = new ObjV1(); // note that we're using the noarg constructor
      ...
      return obj;
   }
}

構築プロセスをより詳細に制御したい場合は、Builder パターンを試してください。

于 2013-04-23T16:27:10.957 に答える