重载抽象方法导致Java中不必要的实现

Posted

技术标签:

【中文标题】重载抽象方法导致Java中不必要的实现【英文标题】:Overloading abstract method causes unnecessary implementation in 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);
    //

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

非常感谢您的精彩解释。对于第二种方法,我认为如果我有多个参数可能会出现问题,但仍可用于 2 个 UUID 值,例如DataExporter&lt;UUID, UUID&gt;。这是真的吗? 您介意使用我上面的代码发布两种方法的实现示例吗?提前致谢。

以上是关于重载抽象方法导致Java中不必要的实现的主要内容,如果未能解决你的问题,请参考以下文章

java实现多态有几种方式?分别是啥?

Java重载重写与实现方法的规则

Android-Java-普通类与抽象类(覆盖)&方法重载

java--面向对象重点

Java中抽象类和抽象方法的区别

JAVA 重写&重载/多态/抽象类/封装/接口/包