Как привязать универсальный объект List к реализующему подклассу - PullRequest
0 голосов
/ 22 мая 2019

На данный момент у меня есть следующие классы:

public abstract class Entity 
{
    private final String id; 
    private String name;
    protected List <CustomerListener> listenerList = new ArrayList<>();

    public void addEntityListener (CustomerListener listener)
    {
        listenerList.add(listener);
    }

    public void setName (String name)
    {
        this.name = name; 
        listenerList.forEach(listener) -> 
        {
            listener.nameChanged(name);
        }
    }
    //Imagine a constructor and some getter ... ;) 
}
public class Customer extends Entity
{
    private String company;
    private String businessUnit;
    private String position;

    public void setCompany (String company)
    {
        this.company = company; 
        listenerList.forEach(listener) -> 
        {
            listener.companyChanged(company);
        }
    }
    //Imagine  a construtor and some more getter and setter.
}

Следующие экземпляры интерфейса хранятся в ArrayList выше:

public abstract interface EntityListener
{
    void nameChanged (String name);
}
public interface CustomerListener extends EntityListener
{
    void businessUnitChanged (String businessUnit);
    void companyChanged (String company);
    void positionChanged (String position);
}

Мое намерение былочто я хочу обрабатывать каждое изменение значения в экземпляре клиента - или в другом экземпляре из экземпляров, наследующих сущность или клиента, - по-другому.Моя проблема в том, что я хочу иметь только один список для хранения этих слушателей.Моя идея заключалась в том, чтобы создать его в сущности суперкласса "Entity".Но я не могу использовать базовый тип слушателя "EntityListener", потому что тогда я не могу вызвать методы из его дочерних интерфейсов.

Как мне просто создать один список для хранения всех слушателей.Но тип, хранящийся в этом списке, должен зависеть от того, какой подкласс используется?Возможно ли это вообще с моим дизайном?

Это важно, потому что я хочу расширить иерархию на другие классы.

Решение, которое я попробовал, состояло в том, что я создал void addCustomerListener (слушатель CustomerListener) в классе клиента, но это приводит кта же проблема.

1 Ответ

2 голосов
/ 22 мая 2019

Как сказал Лино в комментариях, вам нужно сгенерировать свой класс сущностей.

class Entity<L extends EntityListener> {
    protected List<L> listenerList = new ArrayList<>();

    public void addEntityListener(L listener) {
        listenerList.add(listener);
    }

}

class Customer extends Entity<CustomerListener> {

}

interface EntityListener {
    void nameChanged(String name);
}

interface CustomerListener extends EntityListener {
    void businessUnitChanged(String businessUnit);

    void companyChanged(String company);

    void positionChanged(String position);
}

Однако я бы выбрал другой вариант, например, выбрав CustomerService, и пусть служба примет иуведомите слушателей, чтобы вы могли отделить логику (наблюдение / прослушивание) от классов вашего домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...