Nämä tehtävät on tarkoitettu ainoastaan opiskelijoille, jotka pystyvät saavuttamaan 40 % -rajan (23 pistettä) tekemällä 1–8 kappaletta alla olevista lisätehtävistä. Palauta vastauksesi WETO-järjestelmään (https://wetodev.sis.uta.fi/) viimeistään tiistaina 30.6.2020 klo 23.55. Ole huolellinen ja tee kaikki pyydetty. Puutteellisia ratkaisuja ei hyväksytä. Hylätyn ratkaisun voi korjata pääsääntöisesti kerran.

Muuta huomioitavaa:

•	Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@tuni.fi).
•	Lue syötteet Scanner-luokalla ja käytä syötteen lukemiseen vain yhtä Scanner-oliota. Esittele lukija vakiomuotoisena luokka-attribuuttina, jos syötteitä on luettava kahdessa tai useammassa metodissa.
•	Lisäharjoituksille ei ole mikroharjoitusryhmiä.
•	WETO tarkistaa palautuksia automaattisesti sekä tulosteita vertailemalla että tutkimalla luokkien rakennetta ja toiminnallisuutta. Automaattisesta tarkistuksesta ja erityisesti WETOn tekemistä oletuksista attribuuttien ja niiden aksessoreiden suhteen on kerrottu kurssisivujen Harjoitukset | Tarkistus | Automaattinen -kohdassa. Tutustu myös yleisempiä ohjeita sisältävään Harjoitukset | Tarkistus -kohtaan.
•	Testaa luokkaasi omatoimisesti tehtävässä kuvatulla tavalla. Oman testauksen tekemättä jättäminen katsotaan virheeksi. Älä tarkista syötteitä niiden lukemisen yhteydessä ellei tarkistusta erikseen pyydetä, koska metodit tarkistavat parametriarvonsa, mikäli mahdollista.
•	Kaikki tehtävät arvioidaan hyvän ohjelmointitavan osalta. Näin esimerkiksi huono sisennys tai puutteellinen kommentointi voi tuottaa nollan, vaikka ohjelma läpäisee WETOn testit. Muista erityisesti metodin otsikkoon liittyvä yleisluonteinen kommentti metodin tarkoituksesta sekä metodin mahdollisesti saamista ja palauttamista tiedoista. Aksessoreita ei tarvitse kommentoida millään tavoin, ellei niissä tehdä jotain erityisempää.

1.	Kirjoita Javalla konkreettinen Vaate-luokka. Luokalla on kätketty int-tyyppinen koko-attribuutti vaatteen koolle. Luokalla ei ole muita attribuutteja. Kirjoita luokalle julkinen yksiparametrinen rakentaja, jonka parametrin (int) kautta rakentajalle välitetään kokotieto. Tee attribuutille myös aksessorit.

Rakentajasta ja attribuutin arvon asettavasta aksessorista heitetään IllegalArgumentException-poikkeus, jos parametrin arvo on negatiivinen (< 0). Kerro molempien metodien otsikossa throws-ilmauksella minkä poikkeuksen metodi voi heittää. Huomaa, että voit lyhentää ohjelmaa kutsumalla rakentajassa asetusmetodia. Näin toimiessa ei ole tarpeen siepata asetusmetodin heittämää poikkeusta, koska rakentajan tulee heittää sama poikkeus samoissa tilanteissa kuin asetusmetodin.

Tee luokalle kutistu-metodi, joka vähentää vaatteen kokoa yhdellä koolla, jos koko on nollaa suurempi. Tee myös veny-metodi, joka kasvattaa vaatteen kokoa yhdellä koolla. Molemmat metodit ovat void-tyyppisiä eikä näillä metodeilla ole parametreja.

Kirjoita VaateTesti-luokka ja tee sen main-metodissa seuraavaa: a) Tee try-catch-lause, yritä luoda try-osassa vaate antamalla rakentajalle negatiivinen (< 0) arvo ja tulosta catch-osassa vapaavalintainen virheilmoitus. b) Tee try-catch-lause, luo try-osassa vaate antamalla rakentajalle oikeellinen arvo, yritä asettaa asetusmetodilla negatiivinen koko ja tulosta catch-osassa vapaavalintainen virheilmoitus. c) Luo vaate antamalla rakentajalle oikeellinen arvo, kutista vaatetta ja venytä sitä ja tarkista, että nämä metodit toimivat oikein tulostamalla näytölle koon lukuaksessorin palauttama arvo kummankin metodin kutsun jälkeen.

2.	Toteuta 1. tehtävän Vaate-luokassa Comparable-rajapinnan compareTo-metodi siten, että vertailet vaatteita niiden kokojen perusteella. Kiinnitä geneerinen tyyppinimi T tyypiksi Vaate.

Testaa toteuttamaasi metodia ComparableTesti-luokassa siten, että vertailet saman- ja erikokoisia vaatteita eri järjestyksissä. Vertaa myös vaatetta itseensä.

3.	Peri 2. tehtävän Vaate-luokasta konkreettinen Sukka-luokka. Sukalla ei ole vielä tässä vaiheessa omaa attribuuttia.

Kirjoita luokalle julkinen yksiparametrinen rakentaja, jolle välitetään int-tyyppisen parametrin kautta kokotieto. Kutsu rakentajasta yliluokan rakentajaa ja välitä parametriarvo kutsussa yliluokan rakentajalle. Kerro rakentajan otsikossa throws-ilmauksella minkä poikkeuksen rakentaja voi heittää.

Korvaa yliluokan kutistu- ja veny-metodit siten, että molemmat metodit muuttavat sukan kokoa kahden koon verran. Sukka ei kutistu, jos sen koko on nolla tai yksi.

Kirjoita SukkaTesti-luokka ja tee sen main-metodissa seuraavaa: a) Tee try-catch-lause, yritä luoda try-osassa sukka antamalla rakentajalle negatiivinen (< 0) arvo ja tulosta catch-osassa vapaavalintainen virheilmoitus. b) Luo sukka antamalla rakentajalle oikeellinen arvo, kutista ja venytä sukkaa ja tarkista, että nämä metodit toimivat oikein tulostamalla näytölle koon lukuaksessorin palauttama arvo kummankin metodin kutsun jälkeen.

4.	WETOn Viikkoharjoitukset | Lisäharjoitukset -kohdassa on annettu Parillinen-rajapinta. Lisää 3. tehtävän Sukka-luokkaan Parillinen-tyyppiä oleva pari-attribuutti, joka viittaa sukan pariin ja toteuta Parillinen-rajapinta seuraavasti:

a)	Parillinen-metodi palauttaa true-arvon, jos tämän olion pari-attribuutti viittaa olioon. (Tämä olio on olio, jonka kautta metodia on kutsuttu.) Paluuarvo on false, jos attribuutin arvo on null.

b)	

pari

 pari

Yhdistä-metodissa liitetään tämän olion pari-attribuutti parametriin liittyvään olioon ja toisaalta parametriin liittyvän olion pari-attribuutti liitetään tähän olioon. Oliot yhdistetään vain, jos parametriin liittyy toinen Sukka-tyyppiä oleva olio. Onnistuneen yhdistämisen jälkeen sukat viittaavat toisiinsa pari-attribuuttiensa kautta (katso oheinen kuva) ja metodi palauttaa true-arvon. Olioiden tilat eivät muutu ja metodin paluuarvo on false, jos parametriin liittyvä olio ei ole Sukka-tyyppiä, olio yritetään yhdistää itseensä tai parametri on arvoltaan null.

c)	OnPari-metodi palauttaa true-arvon, jos tämä olio ja metodin parametriin liittyvä olio ovat pari.

d)	Erota-metodi asettaa null-arvon tämän olion ja parametriin liittyvän olion pari-attribuuttien arvoksi ja palauttaa true-arvon, jos oliot ovat pari. Paluuarvo on false ja olioiden tilat eivät muutu, jos oliot eivät ole pari tai parametri on null-arvoinen.

Tee pari-attribuutille vain lukeva aksessori. Asettavaa aksessoria ei tarvita, koska luokan omat attribuutit ovat aina saatavilla luokan omissa metodeissa. Esimerkki:

Sukka toinenSukka = (Sukka)toinen;
toinenSukka.pari = this;

Testaa kaikkia rajapinnan metodeja ParillinenTesti-luokassa. Muista testata parametrillisia metodeja myös väärän tyyppisillä olioilla ja null-arvoilla.

5.	Korvaa Object-luokan toString- ja equals-metodit Vaate-yliluokassa (2. tehtävä) ja Sukka-aliluokassa (4. tehtävä). Tee korvaukset Sukka-luokassa super-viitteen avulla ketjuttaen.

Vaate-luokan toString-metodi palauttaa vaatteen koon merkkijonona. Sukka-luokan toString-metodi liittää vaatteen merkkijonoesitykseen parillinen-metodin paluuarvon siten, että tiedot erotetaan toisistaan välilyönnillä, putkimerkillä ja välilyönnillä. Jos sukkaolion koko on esimerkiksi 42 ja parillinen-metodin paluuarvo on false, on olion merkkijonoesitys "42 | false".

Vaatteet katsotaan samoiksi, jos niiden koot ovat samat. Sukat ovat samat, jos niiden koot ovat samat ja lisäksi niiden parillinen-metodien palauttamat arvot ovat samat. Muista varautua mahdollisiin virhetilanteisiin equals-metodissa joko try-catch-lauseella tai valintarakenteella.

Testaa korvattuja metodeja ObjectTesti-luokassa. Tarkista equals-metodin toimivuus niin samanlaisilla kuin erilaisilla vaatteilla ja sukilla. Vertaa olioita myös itseensä, väärän tyyppisiin olioihin ja null-arvoon.

6.	Kirjoita Javalla konkreettinen Vaatekaappi-kaappi luokka, jolla on ArrayList<Vaate>-tyyppinen attribuutti vaatteet kaapin vaatteiden säilömiseen. Kirjoita luokalle oletusrakentaja. Luo rakentajassa taulukkolistaolio ja liitä attribuutti siihen. Tee seuraavat metodit:

a)	public boolean lisää(Vaate vaate). Lisää taulukkolistan loppuun viitteen uuteen vaate- tai sukkaolioon ja palauttaa true-arvon, jos parametriin liittyy olio, jollaista ei ole vielä listalla. Taulukkolista ei muutu ja paluuarvo on false, jos listalla on jo viite tai viitteitä olioihin, jotka ovat equals-metodin mukaan samoja kuin metodin parametriin liittyvä olio. Lisääminen ei onnistu myöskään, kun parametri on null-arvoinen.

b)	public int lukumäärä(). Palauttaa listalla olevien viitteiden lukumäärän.

c)	public Vaate poista(int i). Poistaa listalta indeksiarvoon i liittyvän viitteen ja palauttaa sen paluuarvonaan. Paluuarvo on null, jos parametriarvo on negatiivinen (< 0) tai liian suuri (≥ lukumäärä()).

Testaa vaatekaapin kaikkia metodeja VaatekaappiTesti-luokassa. Tarkista erityisesti, ettei kaappiin voi lisätä samanlaisia olioita tai null-arvoja.

7.	Periytä Javan LinkedList-luokasta OmaLista-luokka ja tee sille metodi, jonka otsikko on:

public Object[] annaViiteet(int[] indeksit)

Metodi palauttaa parametritaulukossa annettuja indeksiarvoja vastaavat listan viitteet luomassaan yksiuloitteisessa taulukossa, jonka koko on sama kuin parametritaulukon. Viitteet palautetaan samassa järjestyksessä kuin niiden indeksit on annettu parametritaulukossa.

Paluuarvo on null, jos parametritaulukossa on yksi tai useampi virheellinen indeksiarvo (< 0 tai ≥ n, missä n listan alkioiden lukumäärä), parametritaulukko tai lista on tyhjä tai jos parametri on null.

Jos listalla on esimerkiksi alkiot "one", "two" ja "three" ja parametritaulukon alkiot ovat {2, 0}, on metodin palauttaman taulukon sisältö {"three", "one"}.

Testaa listaasi erillisessä OmaListaTesti-luokassa.

8.	Piirrä UML-luokkakaavio seuraaville luokille: päiväkoti, lapsi, vanhempi, lastentarhanopettaja, lastenhoitaja, lelu, leikki ja ryhmä. Luokkakaaviossa on oltava luokkien lisäksi assosiaatioita. Assosiaatiot on nimettävä ja niille on määriteltävä kertautumiset. Voit lisätä kaavioon tarvittaessa uusia luokkia. Lisää kaavioon tarvittaessa sen vaikeimmin tulkittavia osuuksia selittävä teksti.