3 Interface, exceptions, generik, iteratorer

Interface, exceptions, generik, iteratorer
3
13
Interface, exceptions, generik, iteratorer
Tema: Interface, exceptions, generik, introduktion till Java Collection FrameWork, iteratorer.
Litteratur: Avsnitt 1.1, 1.5-1.6, 2.1, Appendix A6, A11, A12 (i gamla upplagan: 1.1-1.3, 2.1-2.4, 4.1).
Bilderna från föreläsning 1 och 2.
Interface
U 18. Vad är ett interface och hur ser ett interface ut i stora drag? Vad innebär det att en klass
implementerar ett interface?
U 19. Beskriv likheter och skillnader mellan ett interface och en abstrakt klass.
U 20.
a) Antag att följande interface är deklarerat:
public interface Resizable {
/**
* Scales down the object with scaleFactor.
* @param scaleFactor the scale factor which is used to reduce the
* size of the object
*/
void downSize(int scaleFactor);
}
Skalfaktorn är nämnare i det bråk som beskriver skalan (1: skalfaktor). Ju större skalfaktor man har desto mindre blir avbildningen. Exempel: i en skala 1:10000 motsvaras
10000 cm i verkligheten av 1 cm på avbildningen.
Klassen Rectangle beskriver en kvadrat. Ändra klassen så att den implementerar
interfacet Resizable:
public class Rectangle {
private double height;
private double width;
public Rectangle(double h, double w) {
height = h;
width = w;
}
...
}
b) Avgör för var och en av följande satser om de är korrekta eller ej.
Rectangle r = new Rectangle(50, 100);
Resizable r = new Resizable(50, 100);
Resizable r = new Rectangle(50, 100);
Exception
U 21.
a) Ändra metoden downSize från uppgift U 20 så att exception genereras om parametern scaleFactor har ett värde som är ≤ 0.
b) Antag att en variabel r refererar till ett Rectangle-objekt och att en variable n innehåller ett heltal. Anropa downSize och skriv ut en lämplig felutskrift på System.out
om exception genereras.
Interface, exceptions, generik, iteratorer
14
Implementera en generisk klass
U 22. Antag att det i ett klassbibliotek finns det en generisk klass ArrayCollection som representerar en samling element. (Klassen ArrayCollection är en enkel variant av ArrayList.)
I implementeringen har man använt en vektor för att representera samlingen enligt följande implementeringsskiss:
public class ArrayCollection<E> implements Collection<E> {
private E[] theCollection;
private int size;
/** Constructs an empty list with an initial capacity of ten. */
public ArrayCollection() {
theCollection = (E[]) new Object[10];
}
/** Appends the specified element to the end of this list.
Returns true if this collection changed as a result of the call. */
public boolean add(E x) {
if (size == theCollection.length) {
doubleArray();
}
theCollection[size] = x;
size++;
return true;
}
/** Returns true if this collection contains the specified element. */
public boolean contains(Object x) {...}
/* Creates an new array that is twice the size of the current array and
copies the content of the current array into the new one. */
private void doubleArray() {...}
...
}
Implementera metoderna contains och doubleArray.
U 23. En användare av klassen har implementerat en klass Person enligt följande:
public class Person {
private String name;
...
public boolean equals(Person p) {
return name.equals(p.name);
}
public String toString() {
return name;
}
}
Interface, exceptions, generik, iteratorer
15
Följande kod exekveras:
ArrayCollection<Person> coll = new ArrayCollection<Person>();
coll.add(new Person("Lisa Svensson"));
if (coll.contains(new Person("Lisa Svensson")) ){
System.out.println("Lisa Svensson found");
} else {
System.out.println("Lisa Svensson not found");
}
Utskriften blir ”Lisa Svensson not found”. Förklara varför. Vad ska vi göra för att Lisa ska
hittas?
Ledning:
• Inuti contains anropas en metod för att jämföra två objekt. Vilken?
• Vid kompileringen fastställs signaturen för de metoder som ska anropas. Vilken signatur får ovan nämnda metod?
• I vilken klass börjar sökandet efter en metod med denna signatur vid exekveringen?
• Finns det någon sådan metod i den klassen?
• Finns det någon sådan metod i någon superklass till den klassen?
Iterator
U 24. I java.util finns interfacen Iterator<E> och Iterable<E>. De har snarlika namn och är
därför lätta att blanda ihop. Red ut begreppen genom att diskutera vad de används till
och vad de innehåller för metoder.
U 25. Klassen ArrayCollection från uppgift U 22 implementerar interfacet Collection<E> som
är ett subinterface till interfacet Iterable<E>. Alltså måste klassen ArrayCollection även
implementera metoden iterator(). Antag att detta är gjort och att vi har lagt in ett antal
personer i samlingen ArrayCollection<Person> coll.
a) Skriv programrader som med hjälp av en iterator skriver ut alla personerna i coll.
b) Lös samma problem som i deluppgift a men använd en ”foreach”-sats.
U 26. Ändra klassen ArrayCollection från uppgift U 22 så att den även implementera metoden
iterator().
U 27. Alla interface och klasser som representerar en samling (Collection) i Javas klassbibliotek
har en operation iterator() som returnerar ett objekt av en klass som implementerar
interfacet Iterator. I interfacet Iterator finns bl.a. metoderna hasNext och next som
kan användas för att traversera (iterera över) samlingens element. Varför lägger man inte
i stället in metoderna hasNext och next i samlingsklasserna?