0

(より適切に要約するために、大きな壁のテキストから編集されます) したがって、問題は次のとおりです。

AbstractMyClass のコレクションがあります。このコレクションには、多数の具体的な子クラスがあります。各子クラスには、特定のタイプのオブジェクトのフィールドも含まれます。AbstractMyClass には、それぞれ独自の object フィールドを持つ多数の異なる子が存在する可能性があります。これらの各オブジェクトには、Object 以外に共有の親クラスがない可能性があります。

たとえば、MyClassA には String があり、MyClassB には Integer があり、MyClassC には MyCustomClass がある場合があります。これを行うには、残念ながらさまざまなオブジェクトが必要です。

問題は、このコレクションを評価する必要があり、一連の適切な条件が与えられた場合、AbstractMyClass 内のオブジェクトを抽出、検査、操作、保存、保存などを後の操作のために行う必要があるということです。条件や MyClass/オブジェクト タイプに基づいてさまざまな操作が考えられます。MyClass 内のデータを処理する操作は、他のより集中化されたクラス (つまり、スレッド プールを管理するクラス) のように実行できない場合があります。それらに対処する必要があります。そのため、いくつかの非常に異なるオブジェクト タイプを処理する必要があります。これは確かに実行できますが、それを処理するための合理的にクリーンまたは動的な方法は考えられません。もちろん、次のことを試すことができます。

  • ジェネリックを使用すると、一部の子クラスを削除できますが、そのクラスの外では、オブジェクト T が何であるか、またはこれ以上いじわるせずにそれを処理する方法がわかりません。
  • すべてを型チェックします。これにより、かなり長く醜い条件が作成され、新しいオブジェクト型が導入された場合は維持する必要があります。
  • AbstractMyClass 内のデリゲートですが、これは、各インスタンスを処理するためにさらに多くのクラスを構築することを意味し、デリゲートは必要なすべての機能を処理できない場合があります。
  • すべてのオブジェクト タイプのフィールドを持つラッパー オブジェクト。よし、全部ヌルチェックしよう。

窮地が見えます。この種のことを処理する「良い」方法はありますか、それとも実行時に十分な情報がない可能性があり、誰もがさまざまな方法でそれを回避するため、Java が直接処理できない問題の 1 つにすぎませんか?

4

1 に答える 1

0

応答に対して何をしなければならないかを正確に知らずに、具体的な例がなければ答えるのは難しいですが、基本的に 2 つのクリーンな OO ソリューションが見られます。

最初の解決策: 古き良きポリモーフィズム:

public void handleResponse(AbstractResponse response) {
    response.handle();
}

つまり、Response 自体が受信時の処理に責任を負います。応答は独自の型を認識しており、独自のデータにアクセスできます。

2 番目の解決策:ビジター パターン。これにより、instanceof チェックやキャストを実行せずに応答処理を外部化して、応答の型を知ることができます。

public interface ResponseVisitor {
    void visitA(ResponseA responseA);
    void visitB(ResponseB responseB);
}

public abstract class AbstractResponse {
    public abstract void accept(ResponseVisitor visitor);
    ...
}

public class ResponseA extends AbstractResponse {
    @Override
    public void accept(ResponseVisitor visitor) {
        visitor.visitA(this);
    }
}

public class ResponseB extends AbstractResponse {
    @Override
    public void accept(ResponseVisitor visitor) {
        visitor.visitB(this);
    }
}

public class TheResponseVisitorImplementation implements ResponseVisitor {
    @Override
    public void visitA(ResponseA responseA) {
        ...
    }

    @Override
    public void visitB(ResponseB responseB) {
        ...
    }
}

...

public void handleResponse(AbstractResponse response) {
    ResponseVisitor visitor = new TheResponseVisitorImplementation();
    response.accept(visitor);
}
于 2013-08-23T21:50:17.613 に答える