У меня есть базовый класс
public abstract AbstractThing { };
И множество классов, которые наследуют его
public ThingA extends AbstractThing { };
public ThingB extends AbstractThing { };
...
public ThingY extends AbstractThing { };
У меня есть объект ThingCollector
, который содержит набор объектов Thing, т.е.:
public class ThingCollector {
public void add(AbstractThing newThing);
}
Класс ThingCollector также содержит методы, которые позволяют:
Запрос, какие конкретные вещи он содержит, например,
public Set<Class<? extends AbstractThing>> containsTypes();
Получение подмножества вещей определенного конкретного типа, например
public <S extends AbstractMeasurement> Set<S> getSubset(Class<S> type);
На данный момент мой *Реализация 1029 * содержит закрытое поле типа Set<AbstractThing>
.Метод add(...)
добавляет все к этому же объекту Set.Методы containsTypes()
и getSubset(...)
сплетают свою магию с помощью отражения, перебирая множество.
Это работает, но кажется грязным. Я убежден, что должен быть лучший способ!
Можете ли вы предложить другие способы структурирования своего решения? Я действительно рассматривал вопрос о том, чтобы ThingCollector
поддерживал отдельный Набор для каждого отдельного типа, который расширяет AbstractThing
, но:
Это означает, что ThingCollector
потенциально может содержать десятки объектов Set.И в большинстве случаев использования почти все эти наборы будут пустыми.Несмотря на то, что существует семейство из нескольких десятков вещей, которые наследуются от AbstractThing
, на практике только несколько различных типов вещей будут содержаться в любом данном ThingCollector
.
Это такжебеспорядочный;каждый раз, когда я определяю другой набор в ThingCollector
, мне также нужно добавлять новые методы add(ThingZ t)
и getThingZSubset()
.
Есть ли лучший способ? Есть ли здесь шаблон проектирования или другая организация классов, которая могла бы мне здесь помочь? Я не обязан вышеуказанному интерфейсу для запроса и поднабора содержимого ThingCollector
- все предложения учтены!