Я бы хотел иметь возможность читать и писать (получать и устанавливать) определенные поля для группы связанных, но разных классов , не зная, к какому типу конкретного класса они относятся точно . Все, что я знаю, это то, что у них есть некоторые типы параметров, к которым я хотел бы иметь возможность общего доступа и изменения. И учитывая, что я не знаю, к какому конкретному типу относится класс, я не знаю заранее, каковы конкретные типы параметров каждого из них.
- Я думаю, что следующий подход будет работать, но достаточно ли он хорош / с какими проблемами он может возникнуть?
- Или есть лучшие подходы / или даже установленные шаблоны проектирования для этой проблемы?
Суперкласс для общей настройки
public abstract class ParametrizerBase<P1, P2> {
public P1 Param1;
public P2 Param2;
}
Некоторый конкретный класс с конкретными параметрами, которые ему необходимы
public class SomeConcreteClass extends ParametrizerBase<Boolean, String> {
public SomeConcreteClass(Boolean enabled, String task){
Param1 = enabled;
Param2 = task;
}
// ... does something with the parameter data
}
Другой конкретный класс с различными типами данных
public class AnotherConcreteClass extends ParametrizerBase<Integer, Date> {
public AnotherConcreteClass(Integer numberOfItems, Date when){
Param1 = numberOfItems;
Param2 = when;
}
// ... does something with the data it holds
}
Пример использования
ArrayList<ParametrizerBase> list;
public void initSomewhere() {
SomeConcreteClass some = new SomeConcreteClass(true,"Smth");
AnotherConcreteClass another = new AnotherConcreteClass(5, new Date());
list = new ArrayList<ParametrizerBase>();
list.add(some);
list.add(another);
}
public void provideDataElsewhere() {
for (ParametrizerBase concrete : list) {
String param1Type = concrete.Param1.getClass().getName();
if (param1Type.contains("Boolean")) {
Boolean value = concrete.Param1;
// Now could let user modify this Boolean with a checkbox
// and if they do modify, then write it to concrete.Param1 = ...
// All without knowing what Param1 is (generic configuration)
} else if (param1Type.contains("Integer")) {
Integer value = concrete.Param1;
// ...
} // ...
// Same for Param2 ...
}
}