0

これがシナリオです。

public interface Processor{

    public void create();

    public void setDocuments();

    public abstract void prepareDocuments();

}

public class ProcessorImpl implements Processor{

    public void create(){
        // Do something
    }

    public void setDocuments(){
       // Do something
    }

}

public class ProcessorA implements ProcessorImpl{
    // this class will implement only once abstract 
    // method which is prepareDocuments()

    public void prepareDocuments(){
       // prepare documents..and also 
       // set the Documents list which will be checked by create() 
       // method and then index will be created.

    }

}


public class IndexGenerator{

    public static void main( String[] args){

       ProcessorA a = new ProcessorAImpl();
       a.create();  
    }
}

簡単な背景....インデックスの作成、インデックスからのドキュメントの削除、インデックスへの更新と追加を含むすべての Lucene インデックス関連のアクティビティを処理するための汎用フレームワークを開発しています。ドキュメントの作成を除いて、インデックスを処理するすべてのロジックは同じままです。各インデックスには異なるタイプのドキュメントがあるため、prepareDocuments() メソッドを抽象化し、インデックス タイプごとに実装しました。

ここで、すべてのインデックス ジェネレーター クラスで、ProcessorA のような特定のインデックス プロセッサのインスタンスを作成し、create() メソッドを呼び出すだけにしたいと考えています。しかし、問題は、prepareDocuments が setDocuments() メソッドを呼び出してドキュメントを設定しているにもかかわらず、create() メソッドが常にドキュメント リストの空/null を検出することです。オブジェクト指向の専門家から助けを求める必要がある設計上の欠陥があることはわかっています。

ありがとう

4

2 に答える 2

1

推論できる十分なコードがないため、なぜ空/nullになるのかわかりません。ただし、あなたの問題については、たとえばここで説明されているテンプレートメソッドデザインパターンを使用します:http: //en.wikipedia.org/wiki/Template_method_pattern

それはあなたがやろうとしていることでもあると思います。

ところで。implementsキーワードはインターフェースにのみ使用されます。ここの代わりにそれを使おうとしextendsます:

public class ProcessorA implements ProcessorImpl
于 2012-04-23T06:11:58.823 に答える
0

テンプレートに関する以前の回答 (私は完全に同意します) について詳しく説明すると、 setDocuments() が呼び出される順序に問題があるようです。Template Method Pattern の利点の 1 つは、さまざまなメソッド (abstract または not) が呼び出される順序を強制することです。

次のように基本クラスを再構築することを検討してください。

public interface Processor {
    ...
    // This method orchestrates doc preparation by ensuring the correct
    // ordering of method invocation, and calls the derived class impl
    // method doPrepareDocuments()
    public void prepareDocuments() {
        // do document creation stuff here by calling
        // appropriate methods (abstract or not)

        setDocuments();

        // implemented in derived classes to do specific document preparations
        doPrepareDocuments();
    }

    public abstract void doPrepareDocuments();
    ...
}

このように、すべての派生クラスの実装は、実行するすべての手順とその順序を覚えておく必要はありませんが、代わりに、それが知っていることに焦点を当てています。このアプローチは結束力を高めます。

于 2012-04-23T10:32:54.810 に答える