Ich habe mehrere Klassen, die Wrapper-Methoden erfordern, die wie folgt aussehen:Aufruf Java-Methode Karte unter Verwendung von Werten
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;
}
}
Diese im Code verwendet werden, die Daten aus externen Quellen in ein HashMap
liest und ruft dann addEntry
anrufen der MyClass
Konstruktor. Ich schreibe meine eigenen ***Wrapper
Klassen, so dass ich keinen zusätzlichen MyClass
Konstruktor hinzufügen muss, um die Map
direkt zu lesen.
Alle sehen meine ***Wrapper
Klassen die gleiche, außer für verschiedene names
und classes
Mitglieder und eine handgeschriebene addEntry
hat. Gibt es eine Möglichkeit zu vermeiden, addEntry
manuell zu schreiben, names
und classes
zu verwenden, um die Kartenwerte automatisch in den MyClass
-Konstruktor zu übergeben?
Ja, Sie könnten wahrscheinlich etwas zusammen mit Reflexion zusammenbasteln. –
@EliottFrisch Es fühlt sich an wie etwas, das zur Kompilierzeit getan werden könnte (mit Generika?). Wenn dies C++ wäre, würde ich eine clevere Metaprogrammierungslösung erwarten ... – beldaz
Beachten Sie, dass es nur sehr einfach ist, mit Java 8 auf Parameternamen zuzugreifen (um sie in der Map nachzuschlagen). Mit früheren Versionen von Java möchten Sie wahrscheinlich eine Bibliothek, Spring und andere haben Unterstützung dafür (durch Lesen und Parsing der .class-Datei) –