重载抽象方法导致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();
然后我实现export
和getEntities
方法如下图:
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
,那么我应该如何正确地重载export
和getEntities
方法呢?我通过添加带参数的新方法来重载,但在这种情况下,所有新方法也都需要添加 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<Void>
,它的export
方法只需要null
,而CategoryExporter
可以是DataExporter<String>
。
【讨论】:
非常感谢您的精彩解释。对于第二种方法,我认为如果我有多个参数可能会出现问题,但仍可用于 2 个 UUID 值,例如DataExporter<UUID, UUID>
。这是真的吗?
您介意使用我上面的代码发布两种方法的实现示例吗?提前致谢。以上是关于重载抽象方法导致Java中不必要的实现的主要内容,如果未能解决你的问题,请参考以下文章