2016-08-16 11 views
-2

私はアプリケーションで外部検索エンジンを使用します。次のように私はEngineInterfaceを定義しています:Javaのオブジェクトにラッパーを使用する最も効率的な方法は何ですか?

public interface IEngineInterface{ 
public abstract List<Result> search(String q); 
} 

結果クラス:

public Class Result{ 
    A a; 
    B b; 
} 

とエンジンクラス、このようなものです:

public Class Engine implements IEngineInterface{ 
private static ExternalEngine e = new ExternalEngine; 
@override 
public List<Result> search(String q) { 
    return wrapper(e.search(q)); 
} 

事実はe.searchは戻らないということですList<Result>そしてそれはList<ExternalResult>を返して、個々のリスト項目を超えてそれを変換するラッパー関数を置きます。この問題を解決する最良の方法は何ですか?後でExternalEngineを変更する柔軟性を持たせるために私自身のResultクラスを定義しています。

+0

私は理解できません...何をしますか?** 'e.search()' return? –

+2

'List をループして' List 'に変換するのはあなた次第です – Leon

+0

' ExternalResult'は 'Result'クラスを拡張しますか?もしそうなら、あなたは 'search'を' List <? Result> 'を継承します。 – nbokmans

答えて

0

最も簡単な方法は次のようになります。

public List<Result> search(String q) { 
    List<ExternalResult‌​> exResults = e.search(q); 
    List<Result> results = exResults.stream().map((x) -> new Result(x)).collect(Collectors.toList()); 
    return results; 
} 

あなたがする引数としてExternalResultを取るResultのコンストラクタを実装する必要があります変換。

2
public List<Result> search(String q) { 
    List<Result> resultList = new ArrayList<Result>(); 
    for (ExternalResult exresult : e.search(q)) { 
     resultList.add(new Result(exresult)); 
    } 
    return resultList; 
} 

これは、Java 8で...

+1

を**:**に置き換える必要があります – user6720702

2

あなたは進歩していますが、アプローチは多形ではありません。

は考えてみましょう:

public interface IExternalEngineSearch 
    { 
     public List<ExternalResult> search(String q); 
     public List<Result> parseExternalResult(List<ExternalResult> q); 
    } 

    public class ExternalEngineSearch implements IExternalEngineSearch 
    { 
     @override 
     public List<ExternalResult> search(String q){} 

     @override 
     public List<Result> parseExternalResult(List<ExternalResult> q){} 
    } 

結果クラス:

public Class ExternalResult 
    { 
    A a; 
    C c; 
    B b; 
    } 

    public Class Result{ 
    A a; 
    B b; 
    } 

とエンジンクラスは、このようなものです:

public interface IEngineInterface{ 
    public abstract List<Result> search(String q); 
    } 

    public Class Engine implements IEngineInterface{ 
    private static ExternalEngineSearch e = new ExternalEngineSearch; 
    @override 
    public List<Result> search(String q) { 
    return e.parseExternalResult(e.search(q)); 
    } 

、代わりのEngineクラス内クラスExternalEngineSearchをインスタンス化しますFactory Method Patternを使用して外部クラスを使用すると、必要に応じてより多くの外部検索エンジンを実装に追加できます。あなたのコードは清潔でシンプルで保守的です。

同様:

public Class Engine implements IEngineInterface{ 
    private static IExternalEngineSearch e = ExternalEngineSearchFactory.create(ExternalEngineSearchType.Google); 
    @override 
    public List<Result> search(String q) { 
    return e.parseExternalResult(e.search(q)); 
    } 

私は十分に明確だった願っていますか?

関連する問題