Ich habe derzeit den folgenden Code, der Daten aus der Datenbank abruft und dann ein User
erstellt. Dieser Code wird in vielen meiner Klassen verwendet, um andere Objekte wie News
, Comments
etc ...
Es verwendet Apache commons dbutils.
%Vor% Wäre es möglich, das QueryRunner
in eine generische Klasse zu schreiben und die Abfrage-Methode zu überschreiben, so dass der Handler das generische T
mit dem ResultSet instanziiert. Ich würde sicherstellen, dass jeder T
type einen Konstruktor hat, der ein ResultSet
akzeptiert.
Wie so:
%Vor%Ich weiß nicht, ob Sie es verstehen, aber ich hoffe es, fragen Sie mich, ob Sie mehr Details oder eine bessere Erklärung wollen.
BEARBEITEN
Ich dachte, ich könnte eine abstrakte Klasse anstelle des generischen Typs verwenden, den alle differents-Objekte erweitern würden, aber es scheint, als könnte ich keinen abstrakten Konstruktor schreiben. Muss ich eine statische Methode erstellen, die eine Instanz des Objekts wie folgt zurückgibt:
%Vor%Möglich, ja? Aber es ist eine schlechte Idee.
Sie könnten tun:
%Vor%Das Mischen von Domain und Datenbank ist jedoch eine schlechte Idee. Was wäre jedoch besser, eine abtract-Methode zu definieren, die das Objekt basierend auf dem Resultset erstellt:
%Vor% Dann müssen Sie in Ihrer implementierenden Klasse nur eine create()
-Methode angeben, anstatt das Ergebnis selbst zu bearbeiten, zum Beispiel:
Sie könnten so etwas tun (indem Sie die Klasse des zu erstellenden Objekts übergeben und Reflektion verwenden, um ihren Konstruktor aufzurufen), aber ich würde es schlecht finden, das POJO von JDBC abhängig zu machen und nicht nur zu wissen, wie es ist in der Datenbank gespeichert, aber auch welche Aliase in der Abfrage verwendet wurden, um sie zu laden.
Kurz gesagt, es liegt nicht in der Verantwortung des POJO-Konstruktors, eine Ergebnismenge einer externen, unbekannten Abfrage zu verarbeiten.
Sie könnten eine AbstractSingleEntityHandler-Superklasse entwerfen, die nur über
verfügt %Vor%blockiert und würde die eigentliche Entity-Erstellung an eine abstrakte Methode delegieren, aber Sie würden nicht viel gewinnen.
Ich glaube nicht, dass dies in Java möglich ist. Sie können keine Instanz von T
in einem generischen Objekt erstellen. Generics in Java sind nicht wirklich Templates wie in C ++, sie sind nur Syntax-Sugar um ein object
, das die Umwandlungen entfernt und Compilierungszeit-Warnungen erzeugt.
Es gibt keine Möglichkeit wie in C #, T
so einzuschränken, dass es einen Konstruktor haben muss.
Wenn das wirklich nötig ist, ist es am besten, die entsprechende Klasse mit Hilfe von Reflektion aufzulösen, aber selbst dann werden Sie Probleme bekommen, da Sie die Laufzeitklasse von T nicht kennen können, während die Methode aufgerufen wird Java-Bytecode. Sie müssen also die Klasse an die Methode übergeben, um sie zu reflektieren. Und ich bin mir nicht sicher, ob das überhaupt eine gute Designidee ist.
Tags und Links java constructor generics