Java Class design - Советы для лучшего подхода.Класс расширяет абстрактный класс и реализует интерфейс - PullRequest
0 голосов
/ 23 декабря 2018

Не уверен, какой подход выбрать для классов проектирования.

public interface AuthoringEvent {
   ProcessingResultEvent authoringEvent(Event data);
}

Абстрактный класс AbstractAuthoringEvent реализует интерфейс

public abstract class AbstractAuthoringEvent implements AuthoringEvent {

   @Override
   public ProcessingResultEvent authoringEvent(Event data) {

       ResponseEntity<Event> resultData = callService(data);
       etc...
   }

   protected abstract ResponseEntity<Event> callService(Event requestData);

}

Класс AuthoringEventIT расширяет абстрактный класс

public class AuthoringEventIT extends AbstractAuthoringEvent {

   @Autowired
   private RESTClient restClient;

   protected ResponseEntity<Event> callService(Event requestData) {

     return restClient.callWebServiceWithAction(url, httpPostMethod, requestData, Event.class);
   }

Класс конечной точки ресурса

@Autowired
private AuthoringEventIT authoringEventIT;

@PostMapping()
public ResponseEntity<Event> authorEvent(@RequestBody final EventRequest request) {

    ProcessingResultEvent responseData = authoringEventIT.authoringEvent(request);

    return responseData.getProcessedData();
}

l имеет еще 2 такие же реализации, как классы модели Event for Venue и Organization.Я знаю, что могу удалять интерфейсы и делать все на уровне абстрактных классов, которые все конкретные классы реализуют для своих собственных целей, как это делается в AuthoringEventIT.class, но мой вопрос ...

Нужно ли отдельным абстрактным классаминтерфейсы для реализации?Может быть, все 3 абстрактных класса могут реализовать в одном интерфейсе Authoring какой-то универсальный метод, но как избежать реализации в конкретном классе, например AuthoringEventIT, который расширяет абстрактный класс и необходимо снова реализовать метод интерфейса, который уже реализован в абстрактном классе?Большое спасибо ...

1 Ответ

0 голосов
/ 23 декабря 2018

В среде Spring нет проблем иметь несколько реализаций одного интерфейса.Это не будет проблемой, если между интерфейсом и конечной реализацией будет абстрактный класс.

Существует два способа решения конфликта в этом случае:

  • Использование @Qualifierи загрузите все реализации, чтобы выбрать одну во время выполнения
  • . Используйте одну из @Condition и загрузите одну реализацию, которая зависит от некоторого условия

В первом случае это будет что-то вроде этого

@Component("authoringEventIT")
public class AuthoringEventIT extends AbstractAuthoringEvent { //code }

@Autowired
@Qualifier("authoringEventIT")
private AuthoringEvent authoringEventIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...