2016-08-16 1 views
-2

내 응용 프로그램에서 외부 검색 엔진을 사용하려고합니다.Java에서 객체에 대한 래퍼를 사용하는 가장 효율적인 방법은 무엇입니까?

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

결과 클래스 :

public Class Result{ 
    A a; 
    B b; 
} 

을 그리고 엔진 클래스는 다음과 같이이다 : 다음과 같이 나는 EngineInterface을 정의하고

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>을 반환하고 각 개별 목록 항목을 검토하고 변환하는 래퍼 기능을 넣습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 내 자신의 Result 클래스를 정의하여 나중에 ExternalEngine을 변경할 수있는 유연성을 얻고 있습니다.

+0

이해가 안됩니다 ... ** 무엇을 ** ** e.search()가 반환합니까? –

+2

'List 를 반복하여'List '으로 변환 할 수 있습니다. – Leon

+0

'ExternalResult'가'Result' 클래스를 확장합니까? 그렇다면'search'가'List '를 확장합니다. – nbokmans

답변

0

... 가장 간단한 방법은 다음과 같습니다 당신은 할 인수로 ExternalResult 소요 Result의 생성자를 구현해야

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; 
} 

변환.

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; 
} 

이 자바 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)); 
    } 

나는 내가 충분히 분명 희망?

관련 문제