2009-02-23 16 views
5

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");

+1

Wer sagt, dass dies besser ist? – Milhous

Antwort

4

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 MyObjMyInterface 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)

9

Es gibt keine Garantie, dass die Nicht-Generika-Version ein Objekt vom Typ zurück 'MyObj', so dass Sie einen Classcast bekommen könnten.

6

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.

3

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.

0

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");