Java - von am Mittwoch, Dezember 5, 2007 23:18 - 45 Kommentare

Java Generics – Generische Methoden, Klassen und Interfaces

Generics wurden mit Java 5, dem Tiger-Release, eingeführt und stellen gegenüber Java 1.4 eine erhebliche Arbeitserleichterung dar. Ich möchte Sie in das Thema Generics, anhand der Klasse ArrayList, einführen. Wir werden sehen, welche Probleme es seither beim Ein- und Auslesen von Elementen bei der ArrayList gab und wie sie durch die Einführung von Generics gelöst wurden. Anhand des Comparable Interface möchte ich Ihnen außerdem zeigen, wie generische Methoden, Interfaces und Klassen formuliert werden können.

Wenn Sie tiefer in die Generics einsteigen, und auch andere fortgeschrittene Programmiertechniken kennenlernen möchten, werfen Sie einen Blick auf Fortgeschrittene Programmierung mit Java 5: Generics, Annotations, Concurrency und Reflection von Johannes Nowak. Das Buch geht auf den ersten 150 Seiten detailliert – und dank zahlreicher Beispiele sehr verständlich – auf die Generics in Java ein und ist sehr lesenswert.

Die ArrayList

Planen Sie umzuziehen und brauchen Umzugskartons, einen neuen Teppich und neue Lampen? So erstellen Sie eine Liste. Eine Liste, die alle wichtigen Dinge enthält, die Sie für einen erfolgreichen Umzug brauchen. Wollen Sie eine Liste in Java erstellen, so gibt es drei Möglichkeiten: die Klassen LinkedList, Vector und ArrayList, die alle drei das Interface List implementieren und sich im Package java.util befinden. Wir wollen uns auf Objekte der Klasse ArrayList konzentrieren, da es die beste Implementierung aller Listen darstellt und einen indexierten und sehr schnellen wahlfreien Zugriff hat. Die Elemente der ArrayList werden in gleicher Reihenfolge ausgelesen, wie sie eingegeben wurden. Listen in Java haben wie Arrays einen Index und ein Feld.

Indexposition   Element
      0         String karton = new String("Karton");
      1         String teppich = new String("Teppich");
      2         String lampen = new String("Lampen");

Wie werden der ArrayList Elemente hinzugefügt? Mit der Methode add(). Und wie werden die Elemente wieder aus der ArrayList entfernt? Mit der Methode remove().

Die Methoden der Klasse Iterator machen es Ihnen möglich, Elemente aus der ArrayList auszulesen. Die Methode iterator() liest alle Elemente aus, die Methode hasNext() stellt fest, ob die ArrayList noch weitere Elemente enthält und die Methode next() liest die einzelnen Elemente aus. Wenden wir diese Methoden an, wird uns ein Fehler angezeigt und starten wir die Klasse, wird uns gesagt, dass ein Objekt der Klasse Object gefunden wurde und kein Objekt der Klasse String. Wie seltsam! Wir fügen der ArrayList Objekte der Klasse String hinzu und erhalten aber als Ausgabe Objekte der Klasse Object.

Screenshot: Java Generics - Generische Methoden, Klassen und Interfaces

Wie können Sie diese Fehlermeldung verhindern? Durch einen Cast, sprich das Objekt der Klasse Object muss in ein Objekt der Klasse String zurückgewandelt werden. So muss unsere abgewandelte Klasse Umzug mit Cast wie folgt lauten:

package Beispiele;

import java.util.ArrayList;
import java.util.Iterator;

public class Umzug {

public static void main(String[ ] args){

ArrayList umzugsListe = new ArrayList();
umzugsListe.add("Karton");
umzugsListe.add("Teppich");
umzugsListe.add("Lampen");

for(Iterator i = umzugsListe.iterator(); i.hasNext();){
String s = (String)i.next();
System.out.println(s);
}

}
}

Kompliziert, oder nicht? Dies dachten sich die Entwickler bei Sun auch und sie machten sich Gedanken über eine Lösung, die mit dem Tiger-Release eingeführt wurde. Die Lösung heißt: generische ArrayListen.

Was ist eine generische ArrayList?

Eine generische ArrayList erlaubt es Ihnen genau zu definieren, welche Elemente einer ArrayList hinzugefügt werden dürfen und welche wieder ausgelesen werden. Ergänzen Sie beim Instanziieren die ArrayList um können dieser ArrayList nur Strings hinzugefügt werden und außerdem werden auch nur Strings wieder ausgegeben. Die vollständige Befehlszeile lautet:

ArrayList<string> umzugsListe = new ArrayList<string>();

Wollen Sie die generische ArrayList wieder mit Methoden der Klasse Iterator auslesen, haben Sie wieder das gleiche Problem. Mit dem Iterator wird nach wie vor ein Objekt der Klasse Object ausgegeben und kein Objekt der Klasse String. Um dieses Problem zu lösen, wurde gleichzeitig eine neue for-Schleife eingeführt, die sogenannte erweiterte for-Schleife. Das String s: umzugsListe in der Klammer der unten stehenden for-Schleife liest bei jedem Schleifendurchlauf ein Element der ArrayList aus und speichert es in der Variablen s.

package Beispiele;

import java.util.ArrayList;
import java.util.Iterator;

public class UmzugGenerisch {

public static void main(String[] args){

/*Einer generischen ArrayList<string> können nur Objekte
der Klasse String hinzugefügt werden.*/
ArrayList<string> umzugsListe = new ArrayList<string>();
umzugsListe.add("Karton");
umzugsListe.add("Teppich");
umzugsListe.add("Lampen");</string></string></string>

/*Die erweiterte for-Schleife erlaubt es Ihnen direkt
den Inhalt der ArrayList auszulesen, wobei s vom gleichen
Typ sein muss, wie die Elemente der ArrayList.*/
for(String s: umzugsListe){
System.out.println(s);
}
}
}

Ausgabe:

Karton
Teppich
Lampen

Kein Cast ist mehr nötig und die Methoden der Klasse Iterator sind durch die erweiterte for-Schleife ersetzt worden und die Reihenfolge der Ausgabe entspricht der Reihenfolge der Eingabe.

Werden einer generischen ArrayList Objekte einer bestimmten Klasse übergeben und erhalten Sie Objekte dieser gleichen Klasse als Ausgabe zurück, so nennt man dies Typsicherheit. Es wird sichergestellt, dass Sie immer den gleichen Typ zurückbekommen.

Generische Methoden, Klassen und Interfaces

Kann man auch bei Methoden, Klassen und Interfaces Typsicherheit gewährleisten? Ja! Sie übergeben der Methode, Klasse oder dem Interface einen bestimmten Typ als Parameter. Dies werden wir anhand des Comparable Interface uns näher ansehen. Wozu brauche ich das Comparable Interface? Zum Sortieren von Elementen innerhalb einer ArrayList. Wollen Sie Objekte einer Klasse auf- oder absteigend sortieren, muss diese Klasse das Comparable Interface implementieren. Bei der Klasse String ist dies bereits der Fall. Alles was Sie jetzt noch brauchen ist die statische Methode sort(List list) und reverse(List list) der Klasse Collections des Package java.lang. Wobei das für einen bestimmten Typ als Parameter steht und die Methode sort() aufsteigend sortiert und die Methode reverse() absteigend. Und schon wird die Ausgabe alphabetisch auf- und absteigend sortiert:

package Beispiele;

import java.util.ArrayList;
import java.util.Collections;

public class StringSortieren {

public static void main(String[ ] args){

ArrayList<string> umzugsListe = new ArrayList<string>();
umzugsListe.add("Karton");
umzugsListe.add("Teppich");
umzugsListe.add("Lampen");</string></string>

/*Die statische Methode sort() sortiert die Elemente
aufsteigend.*/
Collections.sort(umzugsListe);

for(String s: umzugsListe){
System.out.println("Aufsteigend: " + s);
}

/*Die statische Methode reverse() sortiert die Elemente
absteigend.*/
Collections.reverse(umzugsListe);

for(String s: umzugsListe){
System.out.println("Absteigend: " + s);
}
}
}

Ausgabe:

Aufsteigend: Karton
Aufsteigend: Lampen
Aufsteigend: Teppich
Absteigend: Teppich
Absteigend: Lampen
Absteigend: Karton

Wie implementiere ich das Interface Comparable?

Für alle anderen Klassen bleibt jetzt die Frage: Wie implementieren wir das Interface Comparable? Das Interface Comparable besitzt eine Methode compareTo(T o), die implementiert werden muss. In den alten Java-Versionen wurde dieser Methode ein Objekt übergeben, das anschließend gecastet, sprich wieder in das ursprüngliche Objekt zurückgewandelt, werden musste. Nun können Sie dieser Methode einen bestimmten Typ übergeben und erhalten so auch den gleichen Typ zurück.

package Beispiele;

/*Sie implementieren das generische Comparable-Interface*/
public class Utensilien implements Comparable<utensilien>{</utensilien>

private String name;

public Utensilien (String name){
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

/*Der Methode compareTo(Utensilien) können Sie nur
noch Objekte der Klasse Utensilien übergeben.*/
public int compareTo(Utensilien u) {

/*Die Namen der Objekte der Klasse Utensilien werden
miteinander verglichen und der Cast
((Utensilien)u).getName() ist nicht mehr nötig.*/
return name.compareTo(u.getName());
}
}

Für alle die es gewohnt waren Objekte casten zu müssen, ist dies sicherlich eine enorme Arbeitserleichterung.

Nachdem das Comparable Interface implemtiert wurde, können Sie jetzt Objekte der Klasse Utensilien der generischen ArrayList hinzufügen und sofort die Methode sort() anwenden.

package Beispiele;

import java.util.ArrayList;
import java.util.Collections;

public class UmzugUtensilien {

public static void main(String[] args){

ArrayList<utensilien> umzugsListe = new ArrayList<utensilien>();
Utensilien u = new Utensilien("Karton");
Utensilien u1 = new Utensilien("Teppich");
Utensilien u2 = new Utensilien("Lampen");</utensilien></utensilien>

umzugsListe.add(u);
umzugsListe.add(u1);
umzugsListe.add(u2);

Collections.sort(umzugsListe);

for(Utensilien utensilien: umzugsListe){
System.out.println("Utensilien: " + utensilien.getName());
}

}
}

Ausgabe:

Utensilien:Karton
Utensilien: Lampen
Utensilien: Teppich

Generics als Thema für die Java-Zertifizierung

Das Thema Generics gehört zu den Prüfungsthemen des Sun Certified Java Programmer (SCJP). Dieses Java-Zertifikat umfasst Grundlagenthemen, wie z.B. Enums, Threads, Varargs, Exceptions, Garbage Collection, Kontrollstrukturen, Arrays, Standardklassen, Grundlagen der Objektorientierung, primitive Datentypen und Ein- und Ausgabe von Datenströmen. Unten stehend finden Sie einige Links zu Materialien. Für alle die sich sehr gute Java-Grundlagen erarbeiten möchten, stellt diese Prüfung eine hervorragende Leistungskontrolle dar. Und in allen Büchern zum Thema finden Sie hervorragende Einführungen in Java.

Sourcecode zum Artikel

Sourcecode: Java Generics

Weiterführende Literatur und zusätzliche Informationsquellen:

Suchen Sie leicht verständliche Erläuterungen für die Java-Grundlagen, dann sind Sie bei Bert Bates und Kathy Sierra und dem Buch „Java von Kopf bis Fuß“ gut aufgehoben. Dieses Buch ist besonders für Anfänger geeignet.

Eine ausführliche Einführung in alle Themen zum Sun Certified Java Programmer finden Sie auch in dem Buch „SCJP Sun Certified Programmer for Java 5 Study Guide“ ebenfalls von Bert Bates und Kathy Sierra.

Vielleicht eines der besten Java-Bücher überhaupt, aber bisher leider nur für 1.4 erhältlich, ist das englische Buch von Khalid A. Mughal und Rolf W. Rasmussen „A Programmer’s Guide to Java Certification: A Comprehensive Primer„.

Wollen Sie sich einen kurzen Überblick über die Neuerungen des Tiger-Releases verschaffen, so wird Ihnen das Buch „Java 1.5 Tiger. A Developer’s Notebook“ von David Flanagan und Brett McLaughlin von großem Nutzen sein.

Wenn Sie sich gerne in die Java-Grundlagen, die Themen der Java-Zertifizierung sind, einarbeiten möchten und Wert auf einfache und ausführliche Erklärungen legen, könnte Sie mein Buch interessieren: „Das große SCJP-Trainingsbuch„.

Sollten Sie Fragen zu allen Java-Zertifizierungen haben, ist das englischsprachige Forum Javaranch die erste Adresse.

Liegt es Ihnen mehr, sich mit einem Simulationssoftware für Zertifizierungen vorzubereiten, so könnte Sie die Software von Whizlabs etwas für Sie sein.

Nähere Informationen zum Sun Certified Java Programmer erhalten Sie auch direkt bei Sun.



45 Kommentare

Sie können Kommentare zu diesem Artikel über den RSS 2.0-Feed nachverfolgen. Sie können einen Kommentar hinterlassen, oder einen Trackback von Ihrer eigenen Website setzen.

Java Generic Method – GeekLogy
Apr 30, 2012 10:25

[…] wird. http://www.theserverside.de/java-generics-generische-methoden-klassen-und-interfaces – besuchen Generic Methods and Constructors (The– This beginner Java tutorial describes fundamentals […]

school washroom refurbishment
Mai 23, 2023 23:09

school washroom refurbishment

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

울산 주점알바
Jun 13, 2023 20:19

울산 주점알바

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

exhibition
Jun 23, 2023 10:40

exhibition

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

web development expert
Jul 1, 2023 19:56

web development expert

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

botanicalgarden
Jul 26, 2023 11:09

botanicalgarden

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

unity forums
Jul 29, 2023 10:24

unity forums

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Savannah Morris
Aug 25, 2023 14:04

Savannah Morris

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

businessmarketingblog
Sep 9, 2023 6:34

businessmarketingblog

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

vk.com
Sep 18, 2023 2:24

vk.com

blog topic

click reference
Okt 30, 2023 8:11

click reference

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Get more information
Nov 7, 2023 10:52

Get more information

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

heliospheric
Nov 8, 2023 16:08

heliospheric

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

look what i found
Nov 11, 2023 8:34

look what i found

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

reference
Nov 11, 2023 9:23

reference

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Recommended Reading
Nov 24, 2023 9:28

Recommended Reading

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Learn More Here
Nov 27, 2023 9:55

Learn More Here

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

水煙
Dez 5, 2023 9:17

水煙

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

fortune slots free games
Dez 6, 2023 8:09

fortune slots free games

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

service ac panggilan surabaya
Dez 9, 2023 3:23

service ac panggilan surabaya

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

More Info
Dez 17, 2023 14:17

More Info

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

service ac sidoarjo
Dez 19, 2023 14:43

service ac sidoarjo

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

click here
Dez 19, 2023 22:36

click here

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

link
Dez 20, 2023 17:45

link

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Full Article
Dez 21, 2023 20:38

Full Article

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Ivermectin
Dez 22, 2023 4:47

Ivermectin

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

site here
Dez 22, 2023 6:25

site here

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Web Site
Dez 24, 2023 14:37

Web Site

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

additional reading
Dez 24, 2023 15:06

additional reading

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

코인리뷰
Dez 24, 2023 17:36

코인리뷰

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

generic
Dez 27, 2023 1:23

generic

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Betsapi betting script
Dez 28, 2023 12:22

Betsapi betting script

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

click to read more
Jan 4, 2024 11:10

click to read more

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

dallas web development company
Jan 4, 2024 13:55

dallas web development company

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Digital Marketing Company Near Me Atlanta
Jan 4, 2024 14:35

Digital Marketing Company Near Me Atlanta

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

e waste disposal near me
Jan 5, 2024 7:26

e waste disposal near me

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Continue
Jan 7, 2024 12:45

Continue

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Flower Shoulder Bag
Jan 11, 2024 17:52

Flower Shoulder Bag

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Find Out More
Jan 19, 2024 12:13

Find Out More

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

spribe aviator prediction app windows 10
Jan 19, 2024 15:22

spribe aviator prediction app windows 10

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Look At This
Jan 20, 2024 13:37

Look At This

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

check this
Jan 21, 2024 17:55

check this

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

helpful hints
Jan 25, 2024 16:46

helpful hints

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Bonuses
Jan 25, 2024 16:55

Bonuses

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Click This Link
Jan 26, 2024 11:20

Click This Link

theserverside.de – Java Generics – Generische Methoden, Klassen und Interfaces

Kommentieren

Weitere Empfehlungen:




-->

Datenbanken, Internet Technologien - Nov 19, 2009 9:24 - 0 Kommentare

Oracle WebServices im praktischen Einsatz

More In Datenbanken


Betriebssysteme - Jul 27, 2006 22:28 - 0 Kommentare

Angriff der Klone!

More In Betriebssysteme