5 Stimmen

Was sind die Vorbehalte bei der Umstellung einer Anwendung auf die Verwendung von Generics in Java?

Ich arbeite mit einer älteren Java-Anwendung, die für Java 1.4 geschrieben wurde, bevor Generics verfügbar waren. Seitdem haben wir unser Upgrade auf Java 6 abgeschlossen.

Wir sind nun dabei, eine Änderung vorzunehmen, um Generics in unseren Sammlungen zu unterstützen, um die Kompilierzeit-Typsicherheitsprüfungen zu verbessern und die Vernunft der Entwickler zu wahren.

Gibt es irgendwelche Vorbehalte oder Probleme, die wir bei der Durchführung dieses Upgrades beachten sollten?

6voto

Stephen C Punkte 665668
  1. Verstehen, wie Java Generics funktionieren und wo ihre Grenzen liegen.
  2. Verwenden Sie eine IDE mit guter Refactoring-Unterstützung.
  3. Tun Sie es langsam und vorsichtig.
  4. Erledigen Sie zuerst die einfachen Dinge und stürzen Sie sich erst dann in die Erstellung komplizierter generischer Klassen usw., wenn Sie wissen, dass sie wirklich erforderlich sind.
  5. Widerstehen Sie der Versuchung, etwas hinzuzufügen @SuppressWarning("unchecked") um die Warnungen zu beseitigen.

Nichts besonders Tiefgründiges hier ...

1voto

Steven Mastandrea Punkte 2642

Der wichtigste Teil des Upgrades besteht IMHO darin, sicherzustellen, dass die Entwickler, die daran arbeiten, ein solides Verständnis von Generics haben, insbesondere im Hinblick auf die Übergabe von Collections in Funktionen und deren Rückgabe aus Funktionen, da List<Animal> <> List<Tiger> , usw. Sie sollten immer in der Lage sein, Generika einzufügen, auch wenn Sie die generischen Platzhalter Object oder ? verwenden.

Eine weitere Voraussetzung für eine reibungslose Konvertierung ist, dass Sie Sammlungen haben, die einen einzigen Typ enthalten, und dass es keine gemischten Objekte gibt, die die ? oder Object-'catch-alls' erzwingen. Dies kann ziemlich häufig sein, vor allem mit Maps.

Wenn Sie zugrundeliegende Bibliotheken, Hibernate usw. verwenden, können Sie dort auf Einschränkungen stoßen, wenn die zugrundeliegende Bibliothek keine Generika unterstützt. In diesem Fall müssen Sie entweder den Bibliothekscode durchsickern lassen oder die Objekte umhüllen (nicht empfohlen).

Ändern Sie die Teile, die sinnvoll sind, und belassen Sie die Teile, die nicht sinnvoll sind, und gehen Sie schrittweise vor, so dass Sie jederzeit einen Teil zurücknehmen können, wenn Sie auf ein Problem stoßen.

1voto

AmaDaden Punkte 804

Stephen hat recht, aber ich würde noch ein paar Tipps hinzufügen.

1) Da Generics nur zur Kompilierzeit verfügbar sind, sind sie an einigen Stellen nutzlos, z. B. bei der Reflexion und der Speicherung von Objekten in der Sitzung (wenn es sich um ein Webprojekt handelt). Ich kenne keinen sauberen Weg, um damit umzugehen. Ich empfehle, alles, was daraus hervorgeht, einfach als <?> und sich nur mit der Typenprüfung beschäftigen.

2) Dies ist eine Sache, die mich in der Vergangenheit verbrannt hat. In Methodendefinitionen verwenden List<? extends Shape> und nicht List<Shape> . Wenn Sie eine Circle Typ, der ein Kind von Shape dann List<Circle> kann nicht an List<Shape> aber sie kann an List<? extends Shape> . Das scheint unbedeutend zu sein, aber für mich kam es sehr plötzlich und erforderte viele zusätzliche Änderungen an Klassen, von denen ich dachte, dass sie fertig sind.

3) Ich glaube nicht, dass Sie JEMALS generische Warnungen unterdrücken müssen, da Sie immer eine List in eine List<?> und sie loszuwerden. Ich empfehle jedoch, dies nicht zu tun, es sei denn, dieser Teil des Codes kann keine Generika verwenden (siehe meinen ersten Punkt). Es ist besser, Warnungen zu haben, die Sie beheben wollen, als schlechte Korrekturen, die Sie verbessern wollen, da Sie sie wahrscheinlich nie verbessern werden und die Warnungen Ihnen jedes Mal ins Gesicht starren, wenn Sie sich Ihr Projekt ansehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X