Vahva koostumussuhde (Composition) - Mitä vahva koostumsusuhde tarkoittaa? - Vahva koostumussuhde vs. yhteyssuhde - Miten toteutan vahvan koostumussuhteen? - Muodostimet - Set ja get-metodit - tostring-metodi 1
Aito/Vahva koostumussuhde (composition) Tarkoittaa koostumussuhdetta, jossa osaolio riippuu isäntäoliostaan kahdella tavalla: Osa ei ole olemassa ilman isäntää Osa voi olla vain yhden isännän osa isännän tulee huolehtia osan luomisesta ja tuhoamisesta Tili -numero -saldo 1 1 Käyttöraja -verkkoraja -nostoraja osaluokka Tili-olio luo oman Käyttöraja-olionsa ja kun Tili-olio tuhoutuu, myös Käyttöraja-olio tuhoutuu 2
Aito/Vahva koostumussuhde (composition) jatkuu Tili-luokan konstruktori luo itselleen Kayttoraja-luokan olion Tili-luokan set-metodilla muutetaan Tilin kayttoraja-olion attribuutteja Tili-luokan get-metodilla palautetaan kopio kayttorajasta Tili-luokasta Kayttoraja-luokan oliota käytetään Kayttorajaluokan metodeilla Kun Tili-luokan olio tuhotaan, samalla tuhoutuu myös Tililuokan sisässä oleva Kayttoraja-luokan olio 3
Vahva koostumussuhde vs. yhteyssuhde Vahva koostumussuhde - oliolla on oma ns. osaolio - olio luo itse osaolion - Yhteyssuhde - oliolla on suhde toiseen olioon - molemman oliot syntyvät itsenäisesti Tili tili = new Tili(); tili: koosteolio osaolio numero: null saldo: 0.00 kayttoraja: Verkkoraja: 1000 Nostoraja:1000 Tili tili = new Tili(); Asiakas asiakas = new Asiakas(); tili.setomistaja(asiakas); 4
Miten toteutan vahvan koostumussuhteen? public class Tili { private String numero; private double saldo; private Kayttoraja kayttoraja; public class Kayttoraja { private double verkkoraja; private double nostoraja; tili-luokassa viittaus Kayttoraja-olioon public Kayttoraja() { verkkoraja = 1000.0; nostoraja = 1000.0; public Kayttoraja(double verkkoraja, double nostoraja) { this.verkkoraja = verkkoraja; this.nostoraja = nostoraja; 5
Muodostimet Tili-luokassa luodaan jokaisessa muodostimessa Kayttoraja-olio public class Tili { private Kayttoraja kayttoraja; public Tili() { kayttoraja = new Kayttoraja(); public Tili(String numero, double saldo) { this.kayttoraja = new Kayttoraja(); // luo olio Jatkuu 6
Muodostimet jatkuu.. Tili tili = new Tili(); tili: numero: null saldo: 0.00 kayttoraja: Tili-olio luo muodostimissaan Kayttoraja-olion oletusmuodostimella verkkoraja: 1000.0 nostoraja: 1000.0 7
Muodostimet jatkuu Tili-luokan parametrillisessa muodostimessa, jossa parametrina on kayttoraja-olio, luodaan oma Kayttoraja-olio ja viedään sille parametrina olevan olion attribuuttien arvot public Tili(String numero, double saldo, Kayttoraja kayttoraja) { this.kayttoraja = new Kayttoraja(); // luo olio if (kayttoraja!= null){ // vie oliolle parametrin tiedot this.kayttoraja.setnostoraja(kayttoraja.getnostoraja()); this.kayttoraja.setverkkoraja(kayttoraja.getverkkoraja()); 8
Muodostimet jatkuu Esim. Kayttoraja kayttoraja = new Kayttoraja (1200.0, 500.0 ); Tili tili = new Tili ( Fi0101, 200.0, kayttoraja); tili: numero: Fi0101 saldo: 200.00 kayttoraja: verkkoraja: 1200.0 nostoraja: 500.0 9
Set-metodi public class Tili { private Kayttoraja kayttoraja; public void setkayttoraja(kayttoraja kayttoraja) { // päivitä prarametrin tiedoilla kayttoraja-olion // attribuutit if (kayttoraja!= null) { this.kayttoraja.setverkkoraja(kayttoraja.getverkkoraja()); this.kayttoraja.setnostoraja( kayttoraja.getnostoraja()); Kutsu: Tili tili = new Tili(); Kayttoraja raja = new Kayttoraja ( 1200.0, 500.0 ); tili.setkayttoraja(raja); 10
Get-metodi get-metodi palauttaa kopion Kayttoraja-oliosta public class Tili { private Kayttoraja kayttoraja; public Kayttoraja getkayttoraja() { // palauta Kayttoraja-olion kopio Kayttoraja kopio = new Kayttoraja (kayttoraja.getverkkoraja(), kayttoraja.getnostoraja()); return kopio; 11
tostring-metodi public class Tili { private Kayttoraja kayttoraja; public String tostring() { return "numero=" + numero + ", saldo=" + saldo + ", käyttöraja= + kayttoraja.tostring(); Kutsu: Tili tili = new Tili(); System.out.println("Tilin tiedot:\n" + tili.tostring()); Kayttoraja raja = tili.getkayttoraja(); System.out.println("Verkossa: " + raja.getverkkoraja() + "\nnostossa: " + raja.getnostoraja()); 12
Pääohjelma public static void main(string[] args) { Scanner input = new Scanner(System.in); Tili tili = new Tili("FI010101", 1000.50); System.out.print("Anna verkkoraja: "); double verkkoraja = input.nextdouble(); System.out.print("Anna nostoraja: "); double nostoraja = input.nextdouble(); // luo Kayttoraja-olio Kayttoraja kayttoraja = new Kayttoraja(verkkoraja, nostoraja); tili.setkayttoraja(kayttoraja); // vie kayttoraja tilille System.out.println("Tilin tiedot:\n" + tili.tostring()); 13
Harjoitus Tee Oppilas-luokka, jonka attribuutit ovat oppilasnro, etunimi, sukunimi, ja syntpvm, jonka toteutat Date-luokan avulla vahvana koostumussuhteena. Oppilas oppilasnro etunimi sukunimi syntpvm Date Tee ohjelma-luokka OppilasOhjelma, joka luo kaksi oppilas oliota ja pyytää käyttäjältä kummallekin syntymäpäivämäärän. 14
ratkaisu public class Oppilas { // attribuutit private int oppilasnro; private String etunimi; private String sukunimi; private Date syntpvm; // vahva koostumissuhde, kompositio // oletusmuodostin/parametriton konstruktio public Oppilas(){ oppilasnro=0; etunimi=sukunimi = null; syntpvm = new Date(); oppilas oliolla on aina Date-olio,johon syntpvm viittaa 15
Ratkaisu jatkuu.. // parametrillinen muodostin eli konstruktori public Oppilas (int nro, String etu, String suku){ oppilasnro= nro; etunimi = etu; sukunimi = suku; syntpvm = new Date(); // 2. parametrillinen muodostin public Oppilas (int nro, String etu, String suku, Date pvm){ oppilasnro = nro; etunimi = etu; sukunimi = suku; if (pvm!= null){ this.syntpvm = (Date)pvm.clone(); // kopioi pvm-olio else syntpvm = new Date(); 16
Ratkaisu jatkuu.. public int getoppilasnro(){ return oppilasnro; public String getnimi(){ return etunimi + " " + sukunimi; // palauttaa kopion syntpvm-oliosta public Date getsyntpvm(){ Date kopio = null; kopio = (Date) syntpvm.clone(); // kopioi syntpvm return kopio; 17
Ratkaisu jatkuu.. public void setoppilasnro(int nro){ oppilasnro = nro; public void setetunimi(string etu){ etunimi = etu; public void setsukunimi(string suku){ sukunimi = suku; public void setsyntpvm ( Date pvm ){ if (pvm!= null){ syntpvm = (Date)pvm.clone(); // kopioi pvm 18
Ratkaisu jatkuu.. public String tostring(){ SimpleDateFormat fdate = new SimpleDateFormat("dd.MM.yyyy"); String paluu; paluu = oppilasnro + " " + etunimi + " " + sukunimi + " " + fdate.format(syntpvm); return paluu; 19
Ratkaisu jatkuu.. public class OppilasOhjelma { private Scanner input; public OppilasOhjelma(){ input = new Scanner(System.in); public static void main(string[] args) { OppilasOhjelma o = new OppilasOhjelma(); o.aja(); 20
Ratkaisu jatkuu.. public void aja() { Oppilas oppilas = new Oppilas(); System.out.println(oppilas.toString()); Oppilas oppilas2 = new Oppilas(100,"Taisto", "Tammi"); Date pvm = pyydapvm("taisto Tammi"); oppilas2.setsyntpvm(pvm); System.out.println(oppilas2.toString()); Oppilas oppilas3 = new Oppilas(200,"Pirkko", "Mannola"); pvm= pyydapvm("pirkko Mannola"); oppilas3.setsyntpvm(pvm); System.out.print(oppilas3.getOppilasnro() + " " + oppilas3.getnimi() + " "); SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy"); pvm = oppilas3.getsyntpvm(); System.out.println(f.format(pvm)); 21
Ratkaisu jatkuu.. private Date pyydapvm (String nimi){ Date pvm = null; String pvmstr; SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy"); do { // pyydetään pvm kunnes käyttäjä antaa kunnollisen System.out.print("Anna opiskelijan " + nimi + " syntymäpävämäärä muodosssa pp.kk.vvvvv: "); pvmstr= input.next(); try { pvm = f.parse(pvmstr); // muuta pvmstr date-olioksi catch (ParseException e){ System.out.println("antamasi pvm on virheellinen!"); pvm = null; while (pvm == null); return pvm; 22
toteutus Miten ohjelma toimii: 0 null null 14.03.2016 Anna opiskelijan Taito Tammi syntymäpäivämäärä muodossa pp.kk.vvvv: 13-5-1967 Antamasi pvm on virheellinen! Anna opiskelijan Taito Tammi syntymäpäivämäärä muodossa pp.kk.vvvv: 13.5.1947 Anna opiskelijan Pirkko Mannola syntymäpäivämäärä muodossa pp.kk.vvvv: kolmesataa Antamasi pvm on virheellinen! Anna opiskelijan Pirkko Mannola syntymäpäivämäärä m muodossa pp.kk.vvvv: 1.1.1956 200 Pirkko Mannola 01.01.1956 23