Перегрузка абстрактного метода приводит к ненужной реализации в Java

#java #interface #polymorphism #overloading #abstract-class

Вопрос:

У меня есть следующий интерфейс:

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

И следующий абстрактный класс наследуется от интерфейса:

 public abstract class AbstractDataExporterlt;Tgt; implements DataExporter {    @Override  public MultipartFile export() throws IOException {  final Iterablelt;Tgt; entities = getEntities();  // ...  }   protected abstract Iterablelt;Tgt; getEntities(); }  

Затем я реализую export и getEntities методы, как показано ниже:

 public class ProductExporter extends AbstractDataExporterlt;ProductDTOgt; {   @Override  protected Iterablelt;ProductDTOgt; getEntities() {  //  } }  

Все, что я работаю без каких-либо проблем, и я вызываю метод экспорта из контроллера, как показано ниже:

 private final ProductExporter productExporter;  public ResponseEntitylt;Resourcegt; exportProduct() throws IOException {  final MultipartFile multipartFile = productExporter.export();  // }  

Моя проблема заключается в следующем: когда мне нужен другой класс экспортера , например, CategoryExporter, который принимает параметр, например, an UUID , как я должен export правильно перегружать методы getEntities and? Я перегружен, добавив новые методы, которые принимают параметр, но в этом случае все новые методы также необходимы для добавления ProductExporter без необходимости. Итак, как решить эту проблему?

 // ??? what about passing parameter: private final CategoryExporter categoryExporter ;  public ResponseEntitylt;Resourcegt; exportCategory(UUID uuid) throws IOException {  final MultipartFile multipartFile = categoryExporter.export(uuid);  // }  

Ответ №1:

Я могу придумать два разумных подхода здесь:

  1. Не имеют общего DataExporter интерфейса. В любом случае клиенту необходимо знать более конкретный тип экспортера, чтобы вызвать его с соответствующими аргументами.
  2. Укажите DataExporter параметр типа и задайте его export методу параметр этого типа. ProductExporter тогда может быть a DataExporterlt;Voidgt; , и его export метод просто принимает null , в то время CategoryExporter как может быть a DataExporterlt;Stringgt; .

Комментарии:

1. Большое спасибо за хорошие объяснения. Для 2-го подхода я думаю, что это может быть проблемой, если у меня есть несколько аргументов, но все равно может использоваться для 2 значений UUID, например DataExporterlt;UUID, UUIDgt; . Это правда?

2. Не могли бы вы опубликовать примеры реализации для обоих из 2 подходов, используя мой код выше? Заранее спасибо.