2014-11-11 7 views
0

나는 pdf에서 텍스트 추출을 다루고있다. 이를 위해 나는 전략을 직접 작성했습니다. 하나의 동적 클래스가 있고이 클래스 내에서 텍스트 추출 전략을 호출합니다. 그러나 동적 클래스에 매개 변수를 도입 할 때 전략 클래스 내에서 사용할 수 없습니다. 명확하게하려면 아래 코드 템플릿을 추가하고 있습니다.void 클래스에 매개 변수를 호출하는 방법은 무엇입니까?

제 질문은 간략하게, renderText에서 "get_intro"클래스에 나타나는 매개 변수 unq을 호출 할 수 있습니까? 또는 다른 방법으로 "render_extro"클래스에서 생성 된 변수 또는 매개 변수를 "get_intro"에서 호출 할 수 있습니까?

public class trial { 

public trial(){} 

    public Boolean get_intro(String pdf, String unq){ 

    try { .... 

      for (int j = 1; j <= 3; j++) { 
      out.println(PdfTextExtractor.getTextFromPage(reader, j, semTextExtractionStrategy)); 
      } 
...} catch (Exception e) { 
     e.printStackTrace(); 
    } 

semTextExtractionStrategy 부분 :

public abstract class DefaultTextExtractionStrategy<D> 
     implements TextExtractionStrategy { 
    protected D documentInfo; 

    public final void setDocumentInfo(D documentInfo) { 
     this.documentInfo = documentInfo; 
    } 

public class SemTextExtractionStrategy extends DefaultTextExtractionStrategy<SemDoc> { 
    @Override 
    public void beginTextBlock() { 
     documentInfo ... 
    } 

public class SemDoc { 
    public String unq: 
} 

그리고 get_intro에서

가 :

 SemDoc semDoc = new SemDoc(); 
     semDoc.unq = unq; 
     semTextExtractionStrategy.setDocumentInfo(semDoc); 
     out.println(PdfTextExtractor.getTextFromPage(reader, j, semTextExtractionStrategy)); 
문제가

당신이 원하는에

public class SemTextExtractionStrategy implements TextExtractionStrategy { 
    @Override 
public void beginTextBlock() { 
} 

@Override 
public void renderText(TextRenderInfo renderInfo) {      

    text = renderInfo.getText();...} 

    @Override 
public void endTextBlock() { 
} 

@Override 
public void renderImage(ImageRenderInfo renderInfo) { 
} 

@Override 
public String getResultantText() { 
    //return text; 
    return main; 
} 
} 
+1

글쎄, 하나의 옵션은 평가판 클래스에서 unq에 대한 변수를 추가하는 것입니다. SemTextExtractionStrategy 클래스에서 액세스 할 수 있도록이 데이터를 저장할 수 있지만 관련된 모든 클래스의 전체 세부 정보가 없어도 실제로 말하기는 어렵습니다. – abalos

답변

0

하나는 다음과 같은 문제가 솔루션을 고려할 수 어떤 상황을 지나치다 ActionEvent 같은 항목 함수를 호출하는 클래스. 그러나 그 이름으로 전략 클래스는 아마도 무국적 싱글 톤입니다. 위의 솔루션에서는 Class<TextExctractionStrategy>, Class<D>에서 새 전략 인스턴스를 인스턴스화해야합니다. 또는 MouseAdapter 클래스와 마찬가지로 모든 메서드에 동일한 이벤트 클래스 매개 변수를 전달합니다.

"지나치게 디자인 된"냄새 또는 비뚤어진 패턴 응용 프로그램 냄새가납니다.

우리는 Java 8 lambdas의 위기에 처해 있으므로 lambdas가있는 디자인의 "백 포트"를 고려할 수도 있습니다.

그러나 API가 외부 라이브러리 용이 아닌 경우 모든 함수에 일반 D textExtractionContext을 추가하는 것이 좋습니다.

+0

귀하의 답변에 대해 @Joop Eggen에 감사드립니다. 그러나 경험이 거의없는 자바 사용자로서 저는 새로운 전략 수업을 인스턴스화하는 것에 약간 혼란 스럽습니다. 솔루션의 첫 번째 부분을 추가하면 모든 것이 잘되었습니다. 그러나 TextExtractionStrategy 부분에 "인터페이스가 비 인터페이스 유형을 확장 할 수 없습니다"라는 오류가 추가되었습니다. 그리고 메소드는 수퍼 클래스 메소드를 오버라이드하지 않습니다. 실제로 SemDoc 파트를 만드는 방법을 모른다. –

+0

클래스를 포함하는 특정 정보를 작성하고 TextExtractionStrategy를 추상 기본 클래스 (확장)로 만들거나 TextExtractionStrategy를 구현하는 매개 변수화 된 DefaultTextExctractionStrategy에서 확장해야합니다. 나는 답을 바로 잡는다. –

+0

DefaultTextExtractionStrategy 아래의 documentInfo는 자동으로 채워지지 않습니다. 내가 그것을 디버그, 그것은 SemTextExtractionStrategy 아래에 null을 찾습니다. "get_intro"의 unq 변수로 documentInfo를 어떻게 채울 수 있습니까? 아니면 완전히 잘못 이해하고 있습니까? @Joop Eggen –