Я несколько классов, которые требуют методов обертки, которые выглядят примерно так:метода вызова Java с использованием карты значений
class MyClass {
public MyClass(String arg1, Date arg2, Integer arg3) {
// Do something with supplied arguments
}
}
class MyClassWrapper {
private ArrayList<MyClass> objects = new ArrayList<MyClass>();
private final String[] names = {"firstparam","secondparam","thirdparam"};
private final Object[] classes = {String.class,Date.class,Integer.class};
public void addEntry(Map<String, Object> params) {
objects.add(new MyClass(
(String)params.get(names[0]),
(Date)params.get(names[1]),
(Integer)params.get(names[2])
));
}
public ArrayList<MyClass> getEntries() {
return objects;
}
public Object[] getColumnClasses() {
return classes;
}
public String[] getColumnLabels() {
return names;
}
}
Они используется в коде, который считывает данные из внешних источников в HashMap
, а затем вызывает addEntry
позвонить конструктор MyClass
. Я пишу свои собственные классы ***Wrapper
, так что мне не нужно добавлять дополнительный конструктор MyClass
, чтобы читать Map
напрямую.
Все мои ***Wrapper
классы выглядят одинаково для имеющих различные names
и classes
членов, за исключением, и рукописным addEntry
. Есть ли способ избежать ручной записи addEntry
, чтобы использовать names
и classes
, чтобы автоматически передавать значения карты в конструктор MyClass
?
Да, вы, возможно, могли бы что-то сбручить вместе с отражением. –
@ElliottFrisch Это похоже на то, что можно было сделать во время компиляции (используя дженерики?). Если бы это был C++, я бы ожидал некоторого умного решения метапрограммирования ... – beldaz
Обратите внимание, что доступ к именам параметров с помощью Java 8 становится проще (для поиска их на карте). С более ранними версиями Java вы, вероятно, хотите, чтобы библиотека вам помогла, Spring и другие поддерживают ее (путем чтения и анализа файла .class) –