1

ファイルからオブジェクトをロードする必要があります。この操作をサポートするクラスのインターフェースを設計する方法がわかりません。

public interface TestComponent {
    TestComponent loadFromXML(Element _xmlElement); 
}

メソッドloadFromXMLを静的にすることはできず、コンストラクターを宣言することも(定義しないでください!)できませんが、loadFromXMLを呼び出すという単一の目的でクラスを作成するのはかなり醜いです。また、switch-case内で指定されたコンストラクターを呼び出すユーティリティクラス内でこれらのメカニズムを分離することも醜いです。

その場合、どのようにインターフェースを設計しますか?抽象クラスを使用する必要がありますか?

4

2 に答える 2

2

あなたの質問のバージョンが少し不自然に見えることに同意します。

いくつかの選択肢があります:

  1. XMLから状態を含む「this」オブジェクトをロードvoid load(...)するインターフェースにを追加できます。(これは、のおよびメソッドにTestComponent類似しています。)loadloadXMLjava.util.Properties
  2. TestComponentXMLを解析してオブジェクトの初期状態を取得するコンストラクターを、各実装クラスで定義できます。
  3. 静的ヘルパーメソッドを作成できます。
  4. ロードされたオブジェクトを返すメソッドをTestComponentFactory持つインターフェースを作成できます。TestComponent load(...)

異なるアプローチには、長所と短所があります。たとえば、ファクトリオブジェクトアプローチ(4.)は、解析/ロードロジックをクラスから分離しますTestComponentが、追加のクラスとインターフェイスが必要です。一方、メインインターフェイスの実装が複数ある場合、他の3つのアプローチは煩雑になる傾向があります。主な問題は、Javaのコンストラクターでポリモーフィズムを実行しないことです。

最後に、これを設計する場合は、load(...)メソッドにストリームまたはリーダーを引数として取り、XML解析自体を実行します(関連するライブラリコードを呼び出すことにより)。そうすれば、すべてを1か所で(TestComponent実装クラスごとに)処理できます。

于 2012-06-01T15:30:05.877 に答える
1

賢明な1つのアプローチは、の戻り値をに変更することloadFromXMLですvoid。このメソッドは、の新しいインスタンスを返す代わりにTestComponent、現在のオブジェクトの内部コンテンツをXMLドキュメントのデータで更新します。

ヒント:インターフェースメソッドのアクセス修飾子はオプションです。これは、インターフェイスメソッドを常にとして定義する必要があるためpublicです。

public interface TestComponent {
    Element saveAsXML() throws ParserConfigurationException;
    TestComponent loadFromXML(Element _xmlElement);  
}
于 2012-06-01T15:04:14.747 に答える