Frage zu Generics und Class

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,
ich habe zwei Fragen zu zwei Themen 🙂. Und zwar

1)
Ich lese mich gerade in Generics ein und frage mich wieso man bei generischen Methoden ein <T> "voranstellen" muss. Zb <T>void methode(T irgendwas). Ist die Methode nicht so gesehen generisch, sobald T in der Paramterliste auftaucht?

Wie intensiv nutzt ihr Generics? Irgendwie habe ich dies bislang nur bei Collections genutzt und wundere mich, wie vielseitig Generics einsetzbar sind. Achtet ihr beim "bauen" eurer Klassen darauf Generics zu nutzen, oder nutzt ihr dies nur zum "Templating" also praktisch dort, wo ihr früher Object übergeben habt, da ihr nicht wusstet welche Objekttypen übergeben werden.

2)
Ich habe im Bereich Reflections bzw. in einigen Quellcodes die ich gelesen habe jetzt gesehen, das Klassen mit Class.forName(...).newInstance() erzeugt wurden.

Begründet wird dies unter anderem damit, das dies genutzt wird, wenn man erst zur Laufzeit weiss, um welche konkrete Klasse es sich handelt.
In anderen Erklärungen heisst es, dass man dies nutzt, um zur Laufzeit dynamisch eine Klasse zu laden. Nur verstehe ich das nicht so ganz.

Mit Klasse x; und später x = new Klasse() erzeuge ich auch dynamisch zur Laufzeit eine Instanz der Klasse und wenn ich nicht genau weiss, welche Klasse ich zur Laufzeit benötige nutzt man doch normal eine Art des Factory Pattern. Könntet
Ihr mir ein paar praktische Beispiele geben, damit ich sehe wo bzw. wie Class.forName überall zum Einsatz kommt? Ist dies evtl nützlich um auf externe Klassendateien zuzugreifen bzw. kann man als Parameter einen kompletten Dateipfad angeben?

Soweit mal 🙂
 
Class.forName verwende ich vor allem um Datenbanktreiber zu laden. Da ich ja erst zur Laufzeit weiß, welche Datenbank überhaupt zugrunde liegt (wird aus einem Properties-file ausgelesen)
 
und selbst wenn man den Treiber kennt (in Anfängerbeispielen steht ja immer ein fester String)
muss man diese Library nicht beim Kompilieren mit dabei haben,
es reicht, die erst zur Laufzeit einzubinden

-------

1)
T könnte ja auch der Name einer Klasse sein,
soll Java erst alle verfügbaren Klassen durchtesten um es dann als Generic zu erkennen?
und wie macht es ein unbedarfter Programmierer, der sich den Quelltext anschaut?

gut, es ginge wohl auch so, aber so ist es eindeutig,
genauso gut könnte man ja den Rückgabetyp void weglassen und als Standard annehmen

----

Benutzen ist eine zwiespältige Sache, vor paar Jahren gabs das noch nicht und da funktionierte Java-Programmierung ja auch 😉

für Java- und eigene Collections,
auch für allgemeine Transformationen praktisch:

Code:
public static <T> Map<Long,T> createLongMap(Map<String, T> oldMap, 
        Map<String, Long> keyChangeMap)
    {
..
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben