Advanced Software Engineering
Übungsblock: Java Generics
Ziel dieses Übungsblocks ist, dass Sie mit der generischen Programmierung vertraut werden. Als
Basissprache wird Java benutzt, die ab der Version 5 auch Generics enthält. In dem Übungsblock
lernen Sie die Verwendung von Generics, insbesondere im Zusammenhang mit dem Collection-
Framework und zum den Entwurf und die Implementierung von generischen Typen kennen.
Aufgabe 1
Gegeben ist folgende Klassenhierarchie:
Figure
id: int
draw()
Circle Square Triangle
Entwerfen und implementieren Sie eine Containerklasse, die Objekte vom Typ Figure (und davon
abgeleitete Typen) aufnimmt und verwaltet. Die Containerklasse soll folgende Schnittstelle besitzen:
FigureContainer
add( fig : Figure )
getFigure( id : int ) : Figure
containsFig( id : int ) boolean
iterator() : Iterator<Figure>
size() : int
drawAll()
Mit Hilfe der Methode add kann dem Container ein Figure-Objekt hinzugefügt werden. Die Methode
getFigure erlaubt den Zugriff auf ein Figure-Objekt über die Id, contains prüft, ob ein Figure-Objekt
mit der übergebenen Id enthalten ist, iterator liefert ein Iterator-Objekt. Die Methode size liefert die
Anzahl der enthaltenen Objekte und drawAll iteriert über alle im Container enthaltenen Objekte und
ruft bei dem Objekt die Methode draw auf.
Überlegen Sie sich, welche interne Datenstruktur für die geforderten Zwecke am sinnvollsten ist.
Versuchen Sie möglichst viel Standardfunktionalität zu benutzen.
© Prof. Dr. J. Hettel, Fachhochschule Kaiserslautern 1
Advanced Software Engineering
Testen Sie Ihre Container-Klasse mit folgendem Programm:
import [Link];
import [Link];
import [Link];
import [Link];
public class FigureContainerTestDriver
{
public static void main(String[] args)
{
FigureContainer container = new FigureContainer();
for( int i=1; i <= 100; i++ )
{
if( i%3 == 0 )
{
[Link]( new Circle(i) );
}
else if( i%3 == 1)
{
[Link]( new Triangle(i) );
}
else
{
[Link]( new Square(i) );
}
}
[Link]("Anzahl der Elemente: " + [Link]() );
[Link]("Enthält id 42 : " + [Link](42) );
[Link](" -- Objekt : " + [Link](42) );
[Link]("Enthält id 8015 : " + [Link](8015) );
[Link](" -- Objekt : " + [Link](8015) );
int count = 0;
Iterator itr = [Link]();
while( [Link]() )
{
[Link]();
count++;
}
[Link]("Ermittelte Anzahl der Elemente: " + count );
[Link]();
}
}
© Prof. Dr. J. Hettel, Fachhochschule Kaiserslautern 2
Advanced Software Engineering
Aufgabe 2
Als nächstes parametrisieren Sie die von Ihnen entwickelte Containerklasse:
Figure
<T>
FigureContainer
add( fig : T )
getFigure( id : int ) : T
containsFig( id : int ) boolean
iterator() : Iterator<T>
size() : int
drawAll()
wobei der Typ-Parameter jeder Sub-Typ von Figure sein kann. Modifizieren Sie weiter das in
Aufgabe 1 gegebene Testprogramm so, dass es mit der neu erstellten Container-Klasse arbeitet.
Aufgabe 3
In der Vorlesung wurde eine parametrisierbare Queue besprochen. Die gezeigte Implementierung
stützte sich auf Standardklassen des Collection-Frameworks.
Realisieren Sie nun eine zweite Datenstruktur für die Queue, die die Queue interne auf eine einfach
verkettete Liste abbildet.
public class ChainQueue<E> implements Queue<E>
{
...
}
Ein neu hinzugefügtes Element wird einfach hinten an die Kette angehängt, ausgelesen werden die
Elemente immer von vorne. Die Klasse ChainQueue definiert zur Verwaltung der Einträge eine
private innere Klasse (Knoten), die dann auch entsprechend parametrisiert sein muss. Das Gerüst sieht
somit wie folgt aus:
public class ChainQueue<E> implements Queue<E>
{
private class Node<A>
{
...
}
...
}
© Prof. Dr. J. Hettel, Fachhochschule Kaiserslautern 3
Advanced Software Engineering
Vervollständigen Sie die Implementierung der Klasse ChainQueue und testen Sie Ihre
Implementierung mit folgendem Programm:
public class QueueDriver
{
static public void main(String[] args)
{
Queue<String> strs = new ChainQueue<String>();
[Link]("hallo1");
[Link]("hallo2");
[Link]("hallo3");
[Link]("Contains: " + [Link]("hallo1"));
[Link]("Contains: " + [Link]("hallo4"));
[Link](" - " + [Link]() + " #" + [Link]() );
[Link]("Contains: " + [Link]("hallo1"));
[Link]("Contains: " + [Link]("hallo4"));
[Link](" - " + [Link]() + " #" + [Link]() );
[Link](" - " + [Link]() + " #" + [Link]() );
[Link](" - " + [Link]() + " #" + [Link]() );
}
}
Aufgabe 4
Schreiben Sie eine Service-Klasse, die eine (statische) Methode bereitstellt, mit deren Hilfe zwei
parametrisierte Queues zu einer vereinigt werden kann. Hierbei sollen jeweils abwechselnd die
Elemente aus den Queues entnommen und in eine neue Queue eingefügt werden. Folgende Abbildung
soll dieses Verfahren verdeutlichen.
Überlegen Sie sich, ob hierzu das Einführen eines neue Interfaces notwendig ist.
1 2 3 4
A 1 B 2 C 3 4
A B C
Schreiben Sie ein Testprogramm, das Ihre Service-Klasse testet.
© Prof. Dr. J. Hettel, Fachhochschule Kaiserslautern 4