【问题标题】:How to invoke a parameter to a void class?如何调用 void 类的参数?
【发布时间】:2014-11-11 13:23:00
【问题描述】:

我正在处理从 pdf 中提取文本。为此我写了自己的文本提取 战略。我有一个动态类,在这个类中我调用文本提取策略。 但是,当我将一些参数引入我的动态类时,我无法在策略类中使用它们。为了清楚起见,我在下面添加了我的代码模板。

我的问题很简单,是否可以从 renderText 调用出现在“get_intro”类中的参数 unq?或者其他方式,可以在“get_intro”中调用“renderText”类中创建的变量或参数吗?

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

【问题讨论】:

  • 嗯,一种选择是在试用类中为 unq 添加一个变量?您可以存储这些数据,以便 SemTextExtractionStrategy 类可以访问它,但是如果没有涉及的所有类的全部详细信息,就很难说。

标签: java itext text-extraction


【解决方案1】:

可以考虑以下有问题的解决方案:

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

问题是您想在调用入口函数(如 ActionEvent 等)时传递一些上下文类。但顾名思义,策略类可能是无状态的单例。在上述解决方案中,您需要从 Class&lt;TextExctractionStrategy&gt;, Class&lt;D&gt; 实例化一个新的策略实例。或者像在 MouseAdapter 类中将相同的事件类参数传递给每个方法。

这有“过度设计”或扭曲模式应用程序的味道。

由于我们正处于 Java 8 lambda 的边缘,您甚至可以考虑使用 lambda 进行设计的“反向移植”。

但目前我会为每个调用的函数添加一个通用的D textExtractionContext,如果 API 不是用于外部库的话。

【讨论】:

  • 感谢@Joop Eggen 的回答。但是作为一个经验不足的 java 用户,我对实例化一个新的策略类有点困惑。当我添加解决方案的第一部分时,一切都很顺利。但是,添加 TextExtractionStrategy 部分会引入错误,因为“接口可能无法扩展非接口类型”。并且方法不会覆盖任何超类方法。确实我不知道如何创建 SemDoc 部分?
  • 您需要创建一些特定的文档信息承载类,并将 TextExtractionStrategy 作为抽象基类(扩展)或从实现 TextExtractionStrategy 的参数化 DefaultTextExctractionStrategy 扩展。我更正了答案。
  • 我看到 DefaultTextExtractionStrategy 下的 documentInfo 不会自动填充。当我调试它时,它在 SemTextExtractionStrategy 下看起来为空。如何使用“get_intro”中的 unq 变量填充 documentInfo。还是我理解完全错误? @Joop Eggen
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2013-11-06
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多