Laboration 4 Objektorienterad programmering i Java I Uppgifter: 1 Beräknad tid: 6 9 timmar Att läsa: Kapitel 7, 8 (stränghantering, arrayer och Vector) Utdelat material (paket) Syfte: Att kunna använda arrayer och klassen Vector Att kunna skapa och använda egna paket Redovisning: Laborationen ska redovisas under ordinarie laborationstid för någon av handledarna. Lycka till!
Uppgift 1 Översikt Denna laboration går ut på att skapa en så kallad containerklass, d.v.s. en klass som kan lagra och hantera flera olika typer av objekt. Syftet är att lära känna begreppet containerklass samt datastrukturer för att hantera ett i förväg inte känt antal objekt. Uppgift Du ska alltså skapa en s.k. containerklass som kan hantera ett antal objekt av typen Media och dess subklasser (från Laboration 3). Containerklassen kan ses som en katalog över en persons innehav av videoband, CD-skivor och böcker. Principen som containerklassen bygger på är att den har ett fält som är en samling referenser till andra objekt. Containerklassen ska alltså fungera som en "behållare" som innehåller ett antal andra objekt, i vårt fall av typen Media. Detta kan göras på ett antal olika sätt, men vi kommer att använda oss antingen av arrayer eller av klassen Vector. Du kommer själv att få välja vilken du vill använda. I och med att vi i förväg inte vet hur många objekt som ska lagras i vår behållare så kan det i det här fallet vara att föredra att använda klassen Vector. Detta eftersom en vektor dynamiskt kan ändra sin storlek (tillskillnad mot en array som har en fast storlek). Skulle du ändå välja att arbeta med arrayer måste du själv hålla reda på hur många element arrayen innehåller och utöka storleken på arrayen med fler element allt eftersom behov uppstår. Containerklassen döper du lämpligen till MediaContainer och denna ska du använda tillsammans med Media, CD, Book och Video från laboration 3 (OBS, kopiera dessa filer eftersom vi ska göra förändringar i dem). Klassdiagrammet från laboration 3 kommer alltså att utökas enligt nedan: MediaContainer Media Publisher Book CD Video Klassen MediaContainer kommer att innehålla ett antal referenser till olika Mediaobjekt (eller referenser till subklasser av Media). I MediaContainer kommer det även att finnas ett antal metoder för att lägga till, ta bort, visa och söka efter olika media. För att underlätta hanteringen av klasserna ska du gruppera ihop dessa klasser i egna paket. Media, CD, Book och Video ska du lägga i paketet media och MediaContainer ska du lägga i paketet media.util. Paket bör alltid anges med gemener (d.v.s. små bokstäver). - 1 -
Det enda fält som egentligen behövs i MediaContainer är en array av typen Media eller ett objekt av klassen Vector. Detta fält ska du kalla container och det är detta fält som kommer att vara själva behållaren som innehåller alla Media-objekt som läggs till i en MediaContainer. Känner du att fler fält behövs är det ok att ha det. Klassens konstruktor har till uppgift att skapa en lämplig stor array eller vektor där olika Mediaobjekt kan lagras. Det ska finnas minst två konstruktorer i klassen. Den konstruktor som inte tar några argument ska sätta en default storlek på den array eller vektor som används. Den konstruktor som tar ett heltal som argument använder heltalet för att bestämma storleken på arrayen eller kapaciteten på vektorn. MediaContainer - container : Vector (container : Media[]) + MediaContainer() + MediaContainer(capacity : int) + addmedia(media : Media) + countmedia() : int + getmedia(index : int) : Media + removemedia(index : int) : boolean + removeall() + searchtitle(title : String) : MediaContainer + print() + printtitle() + tostring() : String addmedia() ska som parameter ta ett Media-objekt och lägga till detta objekt sist i behållaren container (som antingen är en array eller en vektor). Eftersom metoden tar ett Media-objekt som parameter innebär detta att vi kan skicka både CD-, Videooch Book-objekt till metoden. countmedia() ska returnera ett heltal som innehåller antalet inlagda Media-objekt. getmedia() ska returnera det Media-objekt som ligger på det index som skickas till metoden. En kontroll ska utföras i metoden så att ett giltigt index har skickats, dvs att index är större än noll och mindre än antalet inlagda Media-objekt. Är det ett ogiltigt index ska en null-referens returneras (return null;). removemedia() ska ta bort det Media-objekt som ligger på det index som skickas till metoden. En kontroll ska utföras så att ett giltigt index har skickats (se ovan). Har ett Media-objekt tagits bort ska metoden returnera true, om inte returneras false. Viktigt att inga glapp uppstår i behållaren när ett objekt tas bort! removeall() ska ta bort alla objekt som finns inlagda. print() ska skriva ut en lista på skärmen över alla inlagda objekt, samt skriva ut eventuella ledtexter som gör utskriften lätt att tyda. Metoden ska loopa igenom alla inlagda objekt och i sin tur anropa metoden print() hos var och ett av dessa objekt. printtitle() ska fungera som print() men endast titel, artist/författare och mediatyp ska skrivas ut. Utskriften ska ske enligt formatet: title, artist/author (media_type) Ex: Das Boot (video) Club Zebra, Ulf Lundell (cd) Kärlek & ammunition, Kent (cd) Mannen utan öde, Imre Kertesz (bok) tostring() ska returnera en lämplig strängrepresentation av objektet. - 2 -
searchtitle() ska leta igenom alla Media-objekt, som har lagts till i behållaren, efter en angiven titel. Metoden tar en sträng som parameter, som är den titel som eftersöks, och returnera ett objekt av MediaContainer (returtypen ska med andra ord vara MediaContainer). Detta objekt ska innehålla alla de Media-objekt i container som har en titel som motsvarar det sökord som skickas till metoden. Ingen utskrift ska ske i metoden! Det som ska göras i denna metod är alltså att loopa igenom alla de Media-objekt som finns i containern, plocka ut titeln som varje Media-objektet har, och jämföra det med strängen som fås som parameter. Om det visar sig att titeln och strängen är lika (stora och små bokstäver ska inte spela någon roll) ska det aktuella Media-objektet läggas till i den temporära mediacontainern, som måste skapas i metoden. När alla Mediaobjekt kontrollerats ska den temporära mediacontainern returneras. Det är fullt möjligt att fler än ett Media-objekt hittas (även möjligt att inget hittas och att en tom mediacontainer då kommer att returneras). Testklass Som vanligt ska en testklass skapas, som återigen kan ha namnet MediaTest. Denna klass ska innehålla metoden main() där du ska skapa en instans (ett objekt) av klassen MediaContainer. I denna ska du lägga till (mha metoden addmedia()) minst fem objekt av klassen Media (kan vara CD-, Book- och Video-objekt). Därefter ska du på lämpligt sätt demonstrera metoder i MediaContainer. Det kan t.ex. vara att först skriva ut en förkortad lista av innehållet i containern. Sen kan en sökning efter en titel genomföras och resultatet av denna sökning skrivs ut (fullständig lista). Prova att ta bort ett Media-objekt och skriva ut listan igen etc. Tips Som sagt är det betydligt smidigare att använda sig av klassen Vector. Skriver du tostring() metoderna i Media, CD, Book och Video på ett smart sätt kan du utnyttja dem tillsammans med polymorfism för att skriva ut den förkortade listan i printtitle(). Annars går det alltid att använda instanceof för att testa vilken klass ett objekt är av (för att anropa getauthor() eller getartist()). I och med att både superklassen och subklasserna har en print() metod kan du utnyttja polymorfism vid utskrift av all information om inlagda media. Vänta med att skapa paketen media och media.util tills att allt fungerar som det är tänkt. Det ger mindre risk för knepiga felutskrifter av kompilatorn. När du väl skapar paketen är du tvungen (det underlättar i alla fall vid kompelering) att sätta miljövariabeln classpath. Denna anger för Java i vilka mappar class-filer ska letas. Ligger dina paket i h:\java\labb4 så sätter du classpath till.;h:\java\labb4 Punkten i början anger att Java även ska leta i aktuell katalog efter class-filer. Använd någon form av pause-funktion där man måste trycka enter så att inte utskrifterna på skärmen blir för långa (gör denna i testklassen). - 3 -
Krav För att uppgiften ska betraktas som godkänd krävs förutom ovan nämnda detaljer även följande: Åtminstone två av Media-objekten i containern ska ha samma titel. I testklassen är det sen denna titel som ska eftersökas. Inga publika attribut får finnas i någon klass, endast metoder får vara publika. Alla skärmutskrifter skall vara välstrukturerade och lätta att förstå. (Klasser och metoder skall kommenteras med dokumentationskommentarer) När du är klar redovisar du uppgiften eller så börjar du med bonusuppgiften. - 4 -