Создание нового экземпляра реализованного класса на основе типа класса аргумента - PullRequest
0 голосов
/ 13 июня 2019

Я кратко опишу, как выглядит моя структура кода:

  • Класс Aaa реализует EventEmmiter

  • Класс Bbb реализует EventEmmiter

  • Событие класса Aaa реализует событие:

    public class AaaEvent implements Event {
    
        private final Aaa aaa;
    
        public AaaEvent(Aaa aaa) {
            this.aaa = aaa;
        }
    }
    
  • Класс BbbEvent реализует Событие:

    public class BbbEvent implements Event {
       private final Bbb bbb;
       public BbbEvent(Bbb bbb) {
       this.bbb = bbb;
       }
    }
    

Я хочу создать метод createSomething, чтобы избежать дублирования кода. Я хочу, чтобы этот метод создал, в зависимости от типа аргумента (это может быть Aaa или Bbb), новый экземпляр класса, который реализуется из Event.

// EDITED

Ниже вы можете найти класс EventPublisher, который работает должным образом, но выглядит не очень хорошо. Я хочу избежать, если / else или переключить реализацию, потому что она может расти все больше с новыми классами.

public class EventPublisher {
    public void createSomething(EventEmitter eventEmitter) {
        DomainEvent event = null;
        Class<? extends EventEmitter> eventClass = eventEmitter.getClass();
        if (eventClass.isAssignableFrom(Aaa.class)) {
            event = new AaaEvents((Aaa) eventEmitter);
        } else if (eventClass.isAssignableFrom(Bbb.class)) {
            event = new BbbEvents((Bbb) eventEmitter);
        } else if () {
            some next (eg.CccEvents) class
        }

        domainEventBus.publish(event);
    }
}

Например. Если тип EventEmmiter, переданный в качестве аргумента метода, является Aaa, я хочу создать новый экземпляр AaaEvent.

Еще одна вещь. Я не могу использовать внутреннюю упаковку вещей Aaa от AaaEvent. Это работает в другом направлении. Я могу использовать вещи из пакета Aaa внутри AaaEvent.

Можете ли вы дать мне несколько советов, как реализовать такие вещи?

1 Ответ

3 голосов
/ 13 июня 2019

Вы хотите реализовать шаблон фабричного метода :

public interface EventEmmiter {
    Event createEvent();
    ...
}

public class Aaa implements EventEmitter {
    @Override public AaaEvent createEvent() { return new AaaEvent(); }
    ...
}

public class Bbb implements EventEmitter {
    @Override public BbbEvent createEvent() { return new BbbEvent(); }
    ...
}

Теперь вы можете просто использовать его как:

public void createSomething(EventEmitter eventEmitter) {
    Event someEvent = eventEmitter.createEvent();
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...