Java generische Konstruktoren

8

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 ...

zu erstellen

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%     
David 07.02.2012, 20:23
quelle

3 Antworten

8

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:

%Vor%     
Reverend Gonzo 07.02.2012, 20:36
quelle
3

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.

    
JB Nizet 07.02.2012 20:30
quelle
0

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.

    
Dervall 07.02.2012 20:28
quelle

Tags und Links