Warum wird das Folgende als besser als die alte Art des Gießens gesehen?Java Generics
MyObj obj = someService.find(MyObj.class, "someId");
gegen
MyObj obj = (MyObj) someService.find("someId");
Warum wird das Folgende als besser als die alte Art des Gießens gesehen?Java Generics
MyObj obj = someService.find(MyObj.class, "someId");
gegen
MyObj obj = (MyObj) someService.find("someId");
Ein weiterer Vorteil bei der Verwendung eines expliziten Typparameters wäre, dass die Servicemethode unter Verwendung einer Proxy
implementiert wird (in diesem Fall müsste MyObj
MyInterface
sein). Ohne explizite Typparameter wäre dies nicht möglich.
Sie könnten eine Proxy
unter der Decke aus vielen Gründen (Prüfung für eine Person)
Es gibt keine Garantie, dass die Nicht-Generika-Version ein Objekt vom Typ zurück 'MyObj', so dass Sie einen Classcast bekommen könnten.
In Fall 1 könnten die am besten implementierten Dienste null zurückgeben, wenn kein Objekt mit der ID someId
vom Typ MyObj
gefunden werden konnte. Darüber hinaus ermöglicht der erste Fall, dass der Dienst eine bestimmte Logik aufweist, die insbesondere für das Arbeiten mit Klassen des Typs MyObj
geeignet ist.
In Fall 2, wenn Sie instanceof (vermeiden Sie wenn möglich) verwenden, dann riskieren Sie eine hässliche ClassCastException
, die Sie fangen und behandeln müssten.
Ein Grund, warum das erste Szenario besser ist, ist, dass die Methode find(Class,String)
nun weiß, wofür der Rückgabewert zugewiesen wird. Daher ist es jetzt in der Lage, alle relevanten Umwandlungen intern durchzuführen, anstatt einfach zu hoffen, dass der richtige Typ zurückgegeben wurde. Angenommen, die find
Methode sucht intern ein String
Objekt, wenn sie mit "someId"
aufgerufen wird. Das find
-Verfahren kann eine Strategie zum Umwandeln einer String
in eine MyObj
Instanz haben.
Es ist nicht besser nutzen. Wahrscheinlich ist es schlimmer, außer unter ganz bestimmten Umständen. Nur wenn Sie so etwas brauchen, müssen Sie das Ziel newInstance() (etc) für das Klassenobjekt aufrufen - Factory-Methoden und so.
Wenn Sie Elektronen speichern, BTW wollen, wird diese Arbeit auch
MyObj obj = someService.find((Class<MyObj>) null, "someId");
Wer sagt, dass dies besser ist? – Milhous