【问题标题】:Overloading abstract method causes unnecessary implementation in Java重载抽象方法导致Java中不必要的实现
【发布时间】:2021-12-16 17:50:53
【问题描述】:

我有如下界面:

public interface DataExporter {
    MultipartFile export() throws IOException;
}

并且下面的抽象类继承自该接口:

public abstract class AbstractDataExporter<T> implements DataExporter {
    
    @Override
    public MultipartFile export() throws IOException {
        final Iterable<T> entities = getEntities();
        // ...
    }

    protected abstract Iterable<T> getEntities();
}

然后我实现exportgetEntities方法如下图:

public class ProductExporter extends AbstractDataExporter<ProductDTO> {

    @Override
    protected Iterable<ProductDTO> getEntities() {
        //
    }
}

一切正常,我从 Controller 调用导出方法,如下所示:

private final ProductExporter productExporter;

public ResponseEntity<Resource> exportProduct() throws IOException {
    final MultipartFile multipartFile = productExporter.export();
    //
}

我的问题是:当我需要另一个导出器类时,例如CategoryExporter 接受一个参数,例如一个UUID,那么我应该如何正确地重载exportgetEntities 方法呢?我通过添加带参数的新方法来重载,但在这种情况下,所有新方法也都需要添加 ProductExporter,这是不必要的。那么,如何解决这个问题呢?

// ??? what about passing parameter:
private final CategoryExporter categoryExporter ;

public ResponseEntity<Resource> exportCategory(UUID uuid) throws IOException {
    final MultipartFile multipartFile = categoryExporter.export(uuid);
    //
}

【问题讨论】:

    标签: java interface polymorphism overloading abstract-class


    【解决方案1】:

    我可以在这里想到两种合理的方法:

    1. 没有通用的DataExporter 接口。无论如何,客户端都需要知道更具体的导出器类型,以便使用适当的参数调用它。
    2. DataExporter 一个类型参数,并给它的export 方法一个该类型的参数。然后ProductExporter 可以是DataExporter&lt;Void&gt;,它的export 方法只需要null,而CategoryExporter 可以是DataExporter&lt;String&gt;

    【讨论】:

    • 非常感谢您的精彩解释。对于第二种方法,我认为如果我有多个参数可能会出现问题,但仍可用于 2 个 UUID 值,例如DataExporter&lt;UUID, UUID&gt;。这是真的吗?
    • 您介意使用我上面的代码发布两种方法的实现示例吗?提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2021-12-16
    • 2011-12-01
    • 2015-02-28
    • 2022-11-20
    相关资源
    最近更新 更多