Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java 7 Grundkurs

Typsichere Collections mit Generics

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Das Konzept, Klassen mit einem zusätzlichen Typparameter zu versehen, nennt man Generics. Diese generischen Datentypen, also Collections-Klassen und -Interfaces, ermöglichen mehr Typsicherheit und der Quelltext wird kürzer.
06:43

Transkript

Die Collections-Klassen sind dazu geeignet, eine variable Anzahl von Objekten in einer gemeinsamen Datenstruktur vorzuhalten. Wir können eine Liste anlegen, in die wir beliebig viele Strings hineinwerfen. Ich deklariere eine Variable vom Typ List, das ist der Interface-Typ. Ich nenne sie mal Dinge und ich erzeuge ein neues Objekt als Instanz der Klasse Array-list. Das ist eine Implimentierung des Interfaces List. Die Collections-Klassen-Interfaces befinden sich immer im Paket Java-Youtel. Ich muss die entsprechenden Imports hinzufügen. Wenn einer fehlt, weist mich NetBeans darauf hin. Ich kann auf das Lämpchen klicken und hier den Import auswählen. Für das Hinzufügen von Elementen gibt es die Methode Add und jetzt kann ich hier ein Ding in meine Liste einfügen. Füge ich mal noch eines ein. Für dieses Beispiel sollte das genügen. Ich kann durch eine Liste durchinterieren und mir die Elemente herausholen. Ich verwende die For Each -Schleife, die erweiterte Vorschleife. Dazu deklariere ich mir hier eine einzelne Variable, die ein Element der Liste aufnehmen kann. Unabhängig, was ich in die Liste hineingeworfen habe, bekomme es erstmal als Object wieder raus. Ich muss hier also Object hinschreiben, nennen wir es O und dann dahinter den Namen der Collection, durch die ich durchinterieren möchte. Und jetzt gebe ich dieses O einfach aus mit System out printline. Das tippe ich nicht vollständig ein, ich tippe S out und die Tabulatortaste. Und dann übernehme ich hier das O. Wenn ich nur mit einer Variable vom Typ Object auf das jeweilige Objekt verweise, so weiss das Objekt selbst natürlich immer, dass es ein String ist. Gebe ich also mein Objekt aus, bekomme ich den Inhalt des Strings zu sehen. Führen wir das einmal aus. Dazu speichern wir vorher. Auf den grünen Knopf und wir sehen hier Ding und Dong. Funktioniert. Möchte ich innerhalb der Schleife auf string-spezifische Methoden zugreifen, dann muss ich die Variable vorher casten, Auf String, und jetzt kann ich z.B. mir dieses String in Großbuchstaben angeben lassen, indem ich die Methode To upper case verwende. Ich weiß ja, dass ich hier oben nur Strings hineingeworfen habe, deshalb kann ich davon ausgehen, dass ich unten Strings rausbekomme. Das Casten dürfte also keinen Fehlschlag bringen. Kurzer Test: Jetzt haben wir es in Großbuchstaben. Das Befüllen der Liste und das Auslesen der Liste kann sich an verschiedenen Stellen befinden. Diese verschiedenen Stellen müssen nicht vom selben Entwickler geschrieben worden sein. Ich deute mal durch diesen Kommentar an. Es könnte sein, dass ein Entwickler vorsätzlich, oder aus Versehen, Sachen in diese Array-List hineinwirft, die keine Strings sind, z.B. ein Integer-Objekt. Für den Compiler ist das in Ordnung. Ein Integer-Objekt, ein Objekt und Objekte kann ich in diese Liste hineinpacken. Das Auto boxing ermöglicht mir eine verkürzte Schreibweise. Ich kann einfach die 3 reinschreiben und der Compiler erzeugt dann den Code, den ich jetzt gerade eben gelöscht habe. Auch wenn nur eine einfache 3 steht. Es wird trotzdem ein 3-Objekt in die Liste hineingepackt. Versuche ich diese Anwendung auszuführen, dann bekomme ich hier eine Fehlermeldung. Eine Class cast acception, und zwar wehrt sich das Integer-Objekt, in einen String gecastet zu werden, an dieser Stelle. Ist ja auch klar, es ist ja kein String. Leider bemerken wir das erst zur Laufzeit. Es gibt eine Möglichkeit, dem Compiler mitzuteilen, dass in diese Liste tatsächlich nur Strings hineingeworfen werden dürfen. Das mache ich, indem ich in spitzen Klammern hinter dem Namen des Interfaces den Typ angebe. Damit wird diese Referenzvariable Dinge zu einer typisierten Referenzvariable. Es ist nicht mehr einfach nur eine Referenz auf eine Liste, sondern eine Referenz auf eine Liste aus Strings. Die Array-List Strings ist im Moment aber immer noch untypisiert. Ich muss also die spitzen Klammern hinzufügen. Wenn Sie an dieser Stelle eine Fehlermeldung bekommen, dann bedeutet das, dass Ihr Projekt nicht ein Java 7-Projekt ist, denn diesen Operator Spitze Klammer auf, spitze Klammer zu gibt es erst seit Java 7. Wenn Sie mit einer älteren Java-Version arbeiten, müssen Sie hier entweder den Typ einfügen oder Sie entscheiden sich doch auf Java 7 umzusteigen. Dann müssen Sie das im Projekt entsprechend einstellen. Dazu klicken Sie mit der rechten Maustaste auf das Projekt und wählen ganz unten Properties aus. Jetzt müssen Sie dafür sorgen, dass hier unter Libaries als Java-Plattform tatsächlich Java 7 ausgewählt ist. Das ist die eine Einstellung und die Zweite, unter Sources, hier ganz unten, als Format auch ebenfalls Java 7 einstellen. Dann drücke ich auf OK. Ich speichere alles und dann kann ich hier den Typ entfernen. Wir haben festgelegt, dass diese Array-List nur eine List aus Strings sein darf und das gibt dem Compiler die Möglichkeit, zu überprüfen, ob das auch wirklich stimmt. Und wir sehen hier schon, es gibt einen Compilerfehler. Der Compiler kann keine Methode finden, mit der er ein int oder ein integer hinzufügen könnte. Es ist nicht möglich, aus Versehen oder vorsätzlich falsche Datentypen in diese Liste einzufügen. Nehmen wir diese Zeile raus, damit diese rote Kringellinie verschwindet. Das Typisieren einer Collection-Klasse hat einen Vorteil. Dadurch das wir dem Compiler gesagt haben, welcher Typ da hinein darf, bekommen wir diesen Typ automatisch wieder heraus. In unserer for each -Schleife unten bekommen wir nicht nur Object zurück, sondern tatsächlich gleich String. Wir können uns diesen Cast also sparen, Zeile fliegt raus, Strg+E. Unser Quelltext wird nicht nur sicherer, sondern auch besser lesbar. Führen wir das Ganze noch ein weiteres Mal aus und wir sehen, es klappt wunderbar. Dieses Konzept, Klassen mit einem zusätzlichen Typ-Parameter versehen zu können, nennt man Generics. Wir haben hier generische Datentypen. List, Array-list und alle anderen Collections-Klassen und -Interfaces sind auf diese Weise definiert worden. Das kann man in der Java-Doc der Klassen sehen. Wenn wir uns hier z.B. das Interface List ansehen, dann steht hier in spitzen Klammern dahinter NE. Der Typ-Parameter und die Methoden sind nun auch unter Verwendung dieses Typ-Parameters deklariert. Wir haben also bspw. eine Methode, Add. Die nimmt ein E und die Methode get liefert ein E zurück. Deklariere ich meine Liste als Strings, dann ist E also ein String, und das bedeutet, diese Methode erwartet einen String und die Methode get liefert nun auch nur einen String zurück. Wenn Sie Collections-Klassen verwenden, sollten Sie einen solchen Typ-Parameter mit angeben. Sie erreichen dadurch Typ-Sicherheit, D.h. der Compiler kann zur Übersetzungszeit überprüfen, ob Sie nur die Objekte hineinwerfen, die hineindürfen, Ihr Quelltext wird kürzer und besser lesbar, was auch zu einer besseren Wartbarkeit führt.

Java 7 Grundkurs

Machen Sie sich mit den Grundlagen der Java-Programmierung vertraut und lernen Sie die Syntax der Sprache sowie das Konzept der objektorientierten Softwareentwicklung kennen.

8 Std. 32 min (66 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!