olio v12 2014 - students.tut.fisaari5/pla_32100_2015/esimerkit/olio.pdf · 3 kurssin suoritus •...
TRANSCRIPT
3
Kurssin suoritus
• Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä. Eli kurssin maksimipistemäärä on 30. Arvosana määräytyy oheisen taulukon mukaan.
• Tenttiohjelman arviointikriteerit ovat: toimii 2, tekee annetun tehtävän 3, ratkaisutapa 3 ja luettavuus 2.
• Harjoituksia on 20 ja niillä on eräpäivät. Opiskelija lähettää harjoitusten vastaukset sähköpostin liitteenä osoitteeseen [email protected].
• Harjoitus- ja tenttipisteet huomioidaan vain vuoden 2015 aikana.
• Kurssista on kaksi uusintatenttiä (5.6 ja 11.9), joilla voi korottaa heikoimman tentin arvosanaa.
• Luentoesitys ja luennolla rakennetut ohjelmat löytyvät osoitteesta www.students.tut.fi/~saari5/PLA_32100_2015/esimerkit
• Harjoitusten mallivastaukset löytyvät osoitteesta www.students.tut.fi/~saari5/PLA_32100_2015/ratkaisut/ eräpäivän jälkeen.
• Kurssimateriaalina käytetään kirjaa Vesterholm-Kyppö: Java-ohjelmointi (joka oletetaan opiskelijalla olevan käytettävissään)
27 5
24 4
21 3
18 2
15 1
<15 0
PISTEET ARVOSANA
4
Kurssin kirjoja
• Mika Vesterholm, Jorma Kyppö: Java-ohjelmointi, Talentum 2008
• Simo Silander, Vesa Ollikainen, Juha Peltomäki, : Java, Docendo 2010
• Kai Koskimies: Oliokirja
Verkkoaineistot• The Java™ Tutorials
– http://docs.oracle.com/javase/tutorial/index.html
Kurssin sisältö
• Javan oliomallin perusominaisuudet 3 luentoa 3-5 viikot• Graafinen käyttöliittymä 2 6-7• Poikkeusten käsittely 1 8• Tiedostot 1 11• (Oliosuunnittelu: UML 0)• Tietokantaliittymä 2 12-13• (Säikeet 0)• (Geneerisyys 0)• Dokumentointi, versionhallinta 1 14• Kertaus 2 16-17• JPA• Oliokannat• Muut olioparadigmat
6
Miksi luokkia?
PERUSOMINAISUUDET
• Kapselointi
• Periyttäminen
• Monimuotoisuus
EDUT
• Suurten ohjelmistojen rakentaminen (mallintaminen, työnjako, koodin ryhmittely )
• Koodin uudelleenkäyttö (luokkahierarkia, rajapinta, geneerisyys, oliot)
• Muutosten rajaaminen (projektit, paketit, luokat)
Miksa 7
Luokkatyyppejä
• Sovellusluokat• Tekniset luokat
• Konkreettinen luokka• Abstrakti luokka• Ilmiö luokka
• Suoritettava luokka• Luokkakirjasto
MITEN LÖYDÄN LUOKAT?Toimintakuvauksen substantiivit ja
tapahtumat, joista talletetaan tietoa.
Olion data
Olion metodit
8
Luokka ja olio
class Asiakas {static int kpl;String nimi;
static int montako( ) {
return kpl;}
String annaNimi() {return nimi;
}
}
LuokkaLuokka
Olion data
Olion metodit
Luokan data
Luokan metodit
Olion data
Olion metodit
Oliot
new-lauseella
luodaan olioita
ROCK
Rekisteröinti
9
Opiskelija
Suoritus
KAPSELOI
publicprivate
jäsenmaksu
op
opno
annaNro
lisääOp
tarkista
päivitä kirjaaTentti
uusiOpiskelija
tieto ja toiminta
private
Sovellus
Koodin sijoittelu
Make 10
Projekti
Pakkaus
(hakemisto)
Käännösyksikkö (tiedosto)
Luokka
Metodi
Make 11
Koodin sijainti
public class Opiskelija {
// Dataa mutta ei koodia
public void annaNro() {
… // Dataa ja koodia
}
public static int main() {
…
}
}
class Opiskelija {
public void annaNro() {
…
}
}
public class Opettaja {
public void tarkastaTentti() {
…
}
}
package hakemistopolku
public class Opiskelija {
public void annaNro() {
….
}
}
package hakemistopolku
public class Opettaja {
public void tarkastaTentti() {
…
}
}
Käännösyksikkö (tiedosto)metodi ja luokka
pakkaus (hakemisto)
projekti
Make 12
Käännösyksikkö (compilation unit)
• Käännösyksikössä (java-tiedostossa) on vain yksi public-luokka, jonka nimi on tiedoston nimi
• Käännösyksikön (java-tiedosto) kukin luokka kääntyy omaksi class-loppuiseksi tiedostokseen
• Käännösyksikön alussa package-määre ilmoittaa, mihin projektin koodihakemiston (src) alihakemistoon kooditiedostot tallennetaan
• Käännösyksikön käännetyt tiedostot (class-loppuiset) tallentuvat annetun hakemiston (bin) package-määreen mukaiseen alihakemistoon
• Jos ei package-määrettä, tiedostot tallennetaan nyky- eli oletushakemistoon (default package)
• Jotkin editorit saattavat vaatia class-tiedoston lisäksi java-loppuisen tiedoston olemassaolon
Make 13
Pakkaus (package)
• ”A package is a collection of related classes and interfaces providing access protection and namespace management.”
• Pakkaukset muodostavat hierarkkisen rakenteen (hakemistohierarkia)
• Pakkaukset otetaan käyttöön käännösyksikön alussa olevilla import-lauseilla
• Import lauseessa hierarkkisesti määritetään pakkaushakemiston taso
• Alipakkaukset tarvitsee tuoda omalla import-lauseellaan
• Pakkauksesta voi ottaa nimetyn luokan tai kaikki luokat (*)
• Pakkauksessa ei saa olla saman nimisiä luokkia
• Luokkaa haetaan import- tai oletuspakkauksista
• Pakkausta haetaan CLASSPATH-poluista
• Koodi tallennetaan lähdekoodihakemiston package-määreen nimiseen alihakemistoon (pakkaukseen)
• Oletuspakkauksia ovat käännösyksikön pakkaus ja java.lang-pakkaus (String ja System luokat), jotka eivät tarvitse import-lausetta
• Oletuspaketista voidaan viitata toiseen oletuspakettiin ilman import- lausetta! (classpath-polku oltava kunnossa.)
Make 14
Esimerkki: koodin sijainti
package pori.tty;
import java.swing.*; import java.util.Arrays;import omat.jutut.*; //classpath:sta eteenpäin
class Opiskelija {….
}
public class Ryhma { //yksi public luokka tiedostossa…}
Ryhma.java
Make 15
Luokasta olioitapublic class Opiskelija {
private String opno; // luokkamuuttujia
private String nimi; // alustettuja
public void annaNro() { // olio on tietue jos ei metodeita
…
}
}
public class Luokka { public static void main(String[ ] args) {
Opiskelija uusi = new Opiskelija();uusi.annaNro();uusi.nimi=”Timo Teekkari”; // Virhe: ei suoraan ominaisuuteen
… }}
Make 16
Luentoharjoitus 1
Laadi Pankkitili-luokka.
Luokassa on otto- ja pano-metodit.
Kansion toisessa tiedostossa on main-metodi, joka antaa käyttäjän valita toiminnon ja sen perusteella kutsuu pankkitili-luokan metodeja.
Täydennä pankkitililuokkaa sisäänkirjoittautumis- sekä uloskirjautumismetodilla. Jos käyttäjä ei osaa antaa oikeaa salasanaa ei otto- eikä pano-metodit toimi.
Luokkien välinen kutsu ja luokkatason data
Make 17
PERIYTÄ
• Yläluokat kuvaavat yleisiä käsitteitä, joissa kuvataan perustiedot ja yleiset toiminnot
• Yläluokista periytetään aliluokkia (johdettuja luokkia), jotka perivät yläluokan tiedot ja toiminnot
• Aliluokka voi– lisätä uusia tietoja ja toimintoja (tarkentaa yläluokkaa)– korvata yläluokan tietoja ja toimintoja (kuormittaminen)– kehittää yläluokan palveluja (nostaa abstraktiotasoa)
• Näin muodostuu luokkien hierarkia (vrt. käsitehierarkia), joka helpottaa ohjelmien muuttamista ja säästytään samojen asioiden moninkertaiselta koodaamiselta
• Luokat, metodit ja tiedot ovat virtuaalisia eli periytyvät, mikäli ei erikseen estetä (final, private)
• Ei moniperiytyvyyttä, mutta voi toteuttaa useita rajapintaluokkia
luokkahierarkiassa
Make 18
Matti Oja
196054muuta()
LuokkahierarkiaesimerkkiOpiskelija nimi
nromuuta()
Amk Akateeminen
maksa()
Pia Mäki
1234muuta()
Kari Elo
1399muuta()
suunnitelma() suunnitelma()
maksettu
Luokka
Olio
valmistumisvuosi
2013 2012
suunnitelma()
Make 19
Muuttujan näkyvyysmääreet
private4 protected ei mitään public
Sama luokka kyllä kyllä kyllä kyllä
Luokan jälkeläinen ei kyllä1 ei3 kyllä
Pakkauksen luokissa ei ei2 kyllä kyllä
Kaikkialla ei ei ei kyllä
Näkyvyysmääre
Näkyvyys-alue
1. Viitteen oltava viittaavan luokan tyyppiä2. Virheellisesti näkyy pakkauksessa3. Näkyy samassa pakkauksessa4. Private muuttujaan saantimetodit (set/get, accessor)
Make 20
Muuttujan näkyvyys
public class Opiskelija { // alustuu automaatt.
public double keskiarvo(int kpl) {// ei alkuarvoa
} }
maailma
pakkaus
luokka
public String nimi; // kaikkialla
private String opno; // luokassa
static final int TUTKINTO=180;// luokan olioista
String ohjelma=”Tite”; // hakemistossa
protected int aloitusvuosi;// aliluokissa
double ovt = 0; // metodissa
for(int i=0; i<kpl; i++) // lohkossa
ovt += nro[i];return ovt
aliluokka
olio
metodi
lohko
Make 21
Metodin näkyvyys
public class Akateeminen extends Opiskelija {
static int nro() {
… // käyttää staattisia muuttujia ja metodeita
}
public String nimi() {
…
}
private boolean opintotuki( ) {
…
}
protected void maksu() {
…
}
} // jos ei määrettä, näkyy pakkauksessa
22
Luokan näkyvyys
• public luokka // käytettävissä ulkopuolelta
• ei määrettä // käytettävissä paketissa
• final luokka // ei aliluokkia
• abstract luokka // osa/kaikki implementoinnit aliluokissa
• interface luokka // (rajapinta, liittymä)
// kaikki implementoinnit toteuttavassa // luokassa
Miksa 23
Kuormittaminen, korvaaminen, peittäminen
Kenttä tai metodi voidaan peittää luokkahierarkian alimmilta tasoilta määrittelemällä se private-tyyppiseksi
Aliluokassa metodi voidaan korvata samannimisellä metodilla kunhan sekä paluuarvo että parametrit täsmäävät
Samassa luokassa metodi voidaan (yli)kuormittaa samannimisellä metodilla kunhan vain parametrit ovat määrältään tai tyypiltään erilaiset
Make 24
Esimerkki: näkyvyydetclass Koululainen {
double summa, keskiarvo;int kpl;String opiskelijatunnus = "Olli Oppivainen";
public void arvosana(double numero){summa += numero;kpl++;keskiarvo = summa/kpl;
}}
class Perusopiskelija extends Koululainen {int opiskelijatunnus;double opintopisteet;
public void kirjaus () {++opiskelijatunnus;
}public void suoritus (double viikot) {
opintopisteet += 1.5*viikot;}public void suoritus (int pisteet){
opintopisteet += pisteet;}
}
class Jatko_opiskelija extends Perusopiskelija {public void tulosta () {
System.out.println (opiskelijatunnus);System.out.println (opintopisteet);System.out.println (keskiarvo);
}public void suoritus (double ov) {
opintopisteet += 1.2*ov;}
}
Metodi ”suoritus” kuormitettu ja korvattu.
Muuttuja opiskelijatunnus peitetty.
Mitä tulostuu?
Mikä toteutuksessa huonoa? (korjataan harjoituksessa 2)
public class Opiskelijasovellus {public static void main (String[] args) {
Jatko_opiskelija opp = new Jatko_opiskelija();
opp.kirjaus();opp.arvosana(3.5);opp.suoritus(2.5);opp.arvosana(4);opp.suoritus(3);opp.tulosta();
}}
Make 25
Kirjasto
Luokassa• final luokka // estää aliluokat• private konstruktori // estää olion luonnin• public metodeja // tarjottavat palvelut• static metodit // ei tarvita kopioita• static muuttujat // ei tarvita kopioita
Make 26
KONSTRUKTORI
• Konstruktori (rakentaja) on luokan metodi, joka halutaan suorittaa olion synnyn yhteydessä (tarkkaan ottaen konstruktori ei ole luokan metodi, koska ei periydy)
• Konstruktorikoodilla on sama nimi kuin luokalla • Konstruktorilla ei ole paluuarvoa• Oletuskonstruktori
– Luodaan automaattisesti– Ei tee mitään– Parametriton– Ei yleensä tarvitse kirjoittaa– Tarvitsee kirjoittaa jos kirjoitetaan omakin konstruktori– Esim. Opiskelija(){ }
• Javassa ei ole destruktoria (roskien keruu finalize)
Make 27
Konstruktoriesimerkki
public class Opiskelija{private String opno; // luokkamuuttujiaprivate double ov;
public Opiskelija(String opno, double hyvitys) {this.opno=opno;ov=hyvitys;
}}
public class Luokka { public static void main(String[ ] args) {
Opiskelija uusi = new Opiskelija(”178123”, 60); …
}}
Make 28
this, super, this(), super()
• this-sanalla viitataan olioon, jonka sisällä ollaan• this viittaa myös luokan toiseen konstruktoriin• super-sana viittaa isään• super viittaa myös isän konstruktoriin• Jos konstruktorissa halutaan suorittaa toinen
konstruktori on se tapahduttava konstruktorin ensimmäisenä lauseena
Make 29
Konstruktorin kuormittaminen
public class Opiskelija{private String opno; // luokkamuuttujiaprivate double ov;
public Opiskelija(String opno){
this.opno=opno;}
public Opiskelija(String opno, double hyvitys) {this(opno);ov=hyvitys;
}
public Opiskelija(){ } // parametriton olio}
Make 30
Konstruktorien kutsujärjestys
public class Opiskelija {private String opno; private double ov;
public Opiskelija (String opno, double hyvitys) {this(opno);ov = hyvitys;
}
public Opiskelija (String opno){this.opno = opno;
}
public Opiskelija(){} // Välttämätön – missä tilanteessa?
}
public class Lasnaoleva extends Opiskelija {static private int nextOpno;private int vuosi;
public Lasnaoleva () {opno = nextOpno++;System.out.println(”Tervetuloa”+opno);
}
public void kirjaus (int aika) {vuosi = aika;
}}
Korjaa esimerkin virheet!
1. new varaa luokille muistin ja alustaa luokkien muuttujat tyyppinsä alkuarvoihin
2. alustetaan Opiskelija-luokan muuttujat annettuihin alkuarvoihinsa
3. suoritetaan Opiskelija-konstruktori
4. alustetaan Lasnaoleva-luokan muuttujat annettuihin alkuarvoihinsa
5. suoritetaan Lasnaoleva-konstruktori
Make 31
Luentoharjoitus 2
• Laadi monisteen Jatko_opiskelija-, Perus-opiskelija- ja Koululainen luokille järkevät kentät näkyvyysmääreineen.
• Lisäksi laadi konstruktorit, jolla alustat kentät.
• Luo samassa luokassa olevalla main-metodilla kaksi opiskelijaa ja tulosta opiskelijoiden tiedot.
Parametroidut oliot ja konstruktori
Make 32
MONIMUOTOISUUSpolymorfismi
Sovellus
Abstrakti yliluokka
Aliluokka Aliluokka
Yliluokka
Aliluokka AliluokkaRaja-
pinta-
luokka
B
Raja-
pinta-
luokka
A
Dynaaminen viittaus
täydentää abstraktin luokan puuttuvat osat
lisää yliluokkaan tietoja tai metodeja
Make 33
Dynaaminen viittaus
Opiskelija ins = new Opiskelija (”Kalle Hovi”);Akateeminen di = new Akateeminen (60 , ”Matti Mäki”);ins.tulosta();di.tulosta();ins = di;ins.tulosta();
public class Opiskelija {
protected String nimi;
public Opiskelija(){ }
public Opiskelija (String nimi) {
this.nimi = nimi;
}
public void annaNimi (String opnimi) {
nimi = opnimi;
}
public void tulosta() {
System.out.print(nimi);
}
}
public class Akateeminen extends Opiskelija {
private int ov;
// Suorittaa Opiskelija()-konstruktorin
public Akateeminen (int hyvitys, String nimi) {
ov = hyvitys;
this.nimi = nimi;
//annaNimi (nimi); // Olisiko tämä parempi?
}
public void tulosta() {
System.out.print(nimi+ov); // Miten korjataan } // jos nimi private?
}
Mitä tulostuu?
Make 34
Abstrakti luokka
• Abstrakti luokka määrittelee korkean tason käsitteen, jonka toiminnot on (täysin) määritelty, mutta ei välttämättä toteutettu
• Abstrakti luokka siis antaa kutsujalle (täydellisen) kuvan käsitteestä ja mahdollistaa sen käytön ennen kuin kaikki varsinaiset implementaatiot on tehty (mahdollistaa siis ajan mukaan tapahtuvan käsitteiden kehittelyn ja säästää perusasioiden uudelleen koodaamiselta)
• Abstraktista luokasta periytyvän aliluokan pitää toteuttaa kaikki isänsä ei-toteutetut metodit (lupaus kutsujalle)
• Aliluokka perii ja voi syrjäyttää abstraktin isänsä metodit ja muuttujat
• Aliluokka luonnollisesti voi lisätä uusia muuttujia ja metodeja• Abstraktista luokasta ei voi luoda ilmentymiä (olioita)• Luokka ja abstraktit metodit merkitään sanalla “abstract”
Make 35
Abstrakti luokka - esimerkki
abstract class AbstractOpiskelija {private String etunimi;private String sukunimi;
public AbstractOpiskelija(String enimi, String snimi){etunimi = enimi;sukunimi = snimi;
public String nimi(){return etunimi+" "+sukunimi;
}
abstract double keskiarvo();}
class Opiskelija extends AbstractOpiskelija{private double[] arvosanat;
public Opiskelija(String enimi, String snimi, double[] ov){super (enimi, snimi);arvosanat = ov;
}
public double keskiarvo(){double summa=0;int kpl=0;
for (int i=0; i<arvosanat.length; i++){if (arvosanat[i]>0){
summa += arvosanat[i]; kpl++;
}}return summa/kpl;
}
public String toString(){return nimi()+" "+keskiarvo();
}}
public class AbstraktiEsimerkki{
public static void main(String[] args){
double[] tulokset = {1, 2.5, 0, 4, 5};
AbstractOpiskelija di = new Opiskelija("Kalle","Koivu“,tulokset);
System.out.println(di);
}
}
Make 36
Rajapintaluokka
• Rajapintaluokka on täysin abstrakti eli ei lainkaan koodia -pelkkiä metodimäärittelyjä
• Luokassa pitää olla toteutukset kaikille käyttämänsä rajapinnan metodeille
• Luokka voi toteuttaa useita rajapintoja
• Rajapinta voi “toteuttaa” toisia rajapintoja
• Jos määritellään muuttujia tulee niistä luokan vakioita (static final)
• Abstrakti luokka on olion abstraktio, rajapintaa voidaan pitää palvelujen mallina
(käyttöliittymä, interface)
interface Opintotoimisto{public void annaArvosana(int kurssi, double numero);public void tulostaArvosanat();public String toString();
}_____________________________________________________interface Suoritukset{
public void tulostaArvosanat();}_____________________________________________________abstract class AbstractOpiskelija {
private String etunimi;private String sukunimi;
public AbstractOpiskelija(enimi, snimi){etunimi = enimi;sukunimi = snimi;
}
public String nimi(){return etunimi+" "+sukunimi;
}
abstract double keskiarvo();}
Make 37
Rajapintaluokka esimerkkiclass Opiskelija extends AbstractOpiskelija
implements Opintotoimisto, Suoritukset{private double[] arvosanat;
public Opiskelija(String enimi, String snimi, double[] ov){super (enimi, snimi);arvosanat = ov;
}
public void annaArvosana(int kurssi, double numero){arvosanat[kurssi-1] = numero;
}
public void tulostaArvosanat(){System.out.println(toString());for (int i=0; i<arvosanat.length; i++)
System.out.println(arvosanat[i]);}
public double keskiarvo(){double summa=0;int kpl=0;for (int i=0; i<arvosanat.length; i++){
if (arvosanat[i]>0){summa += arvosanat[i];kpl++;
}}return summa/kpl;
}
public String toString(){return nimi()+" keskiarvo= "+keskiarvo();
}}
public class ImplementsEsimerkki{public static void main(String[] args){
double[] tulokset = {1, 2.5, 0, 4, 5};
Opintotoimisto di = new Opiskelija("Kalle", "Koivu", tulokset);
di.tulostaArvosanat();di.annaArvosana(3, 4);di.tulostaArvosanat();
}}
Geneerisyys
• Viitetyyppejä (olioita) voidaan korvata geneerisellä muuttujalla
Geneerinen määritys: ArrayList <E> ();
Tyypittäminen olioilla: new ArrayList <Asiakas> ();
• Perustietotyyppejä ei voida korvata geneerisellä muuttujalla
• Parametrina on tapana käyttää isoa kirjainta T (tyyppi), E (elementti),…
• Geneerinen metodi• Geneerinen luokka• Geneerinen rajapinta
Make 38
MetodinKuormitus.java
MetodiGeneerinen.java
GeneerinenArray.javaGeneerinenRajapinta.java
GeneerisyysArrayList<Asiakas> lista = new ArrayList<>();
Make 39
public interface Pino <E> {
public void laita(E olio);public E ota();
}
public class RajattuPino <E> implements Pino <E> {private koko;
private E[ ] oliot = (E[ ]) new Object[10];
public void laita (E olio) {oliot[koko++]= olio;
}
public E ota() {return oliot[--koko];
}}
Pino <Asiakas> luettelo = new RajattuPino <>();
Sovellus
Sovellus
public static <T> void laitaPinoon(T olio, Pino<T> pino){pino.laita(olio);
}
Make 40
OLIOIDEN KÄYTTÖTILANTEITA
Make 41
Olioita kokoelmassa
public class Oliotaulukko {
public static void main(String[] args) {
Henkilo[] tekijät = new Henkilo[5];tekijät[0] = new Henkilo("Liisa", 2000);
tekijät[1] = new Henkilo("Teija", 3000);
tekijät[2] = new Henkilo("Kalle", 1500);
tekijät[3] = new Henkilo("Risto", 1900);
tekijät[4] = new Henkilo("Marko", 1800);
int summa = 0;
for (Henkilo ihminen: tekijät) {
summa += ihminen.annaPalkka();
System.out.println(ihminen);
}
System.out.println("\nPalkkasumma "+summa);
}}
class Henkilo {
static int id=100;
private int hlonro;private String nimi;
private double palkka;
Henkilo (String nimi, double rahaa){
this.nimi = nimi;
palkka = rahaa;
hlonro = id++;
}
public double annaPalkka(){
return palkka;
}
public String toString(){
return hlonro+": "+nimi;
}
}
Make 42
Olioita parametrina
public class Olioparametri {
public static void main(String[] args) {
Henkilo1[] tekijät = new Henkilo1[5];tekijät[0] = new Henkilo1("Liisa", 2000);
tekijät[1] = new Henkilo1("Teija", 3000);
tekijät[2] = new Henkilo1("Kalle", 1500);
tekijät[3] = new Henkilo1("Risto", 1900);
tekijät[4] = new Henkilo1("Marko", 1800);
int summa = 0;
for (Henkilo1 ihminen: tekijät)
tulosta (ihminen);
}
private static void tulosta(Henkilo1 henkilo){
System.out.println(henkilo);}
}
class Henkilo1 {
static int id=100;
private int hlonro;private String nimi;
private double palkka;
Henkilo1 (String nimi, double rahaa){
this.nimi = nimi;
palkka = rahaa;
hlonro = id++;
}
public String toString(){
return hlonro+": "+nimi+" "+palkka;
}
}
Make 43
Olion tulostaminen
• Tulostettaessa olio tulostaa toString()-metodin palauttama arvon
• Yleensä Object-luokan toString() palauttama arvo ei ole riittävä, vaan olioon kannattaa ohjelmoida oma toString()-metodi
• Samoin toimivat rajapintamekanismin callback-metodit (käyttöliittymissä, lajittelussa,…)
Palvelu p= new Palvelu();p.laske(this);
public void kaava(){...
}
public laske(Object a){...
a.kaava();...
}
palvelu
Olioiden vertailu
Make 44
Olioiden vertailu
Make 45
Make 46
Olio-ohjelmointi ohjeita
1. Kaunis ohjelma
2. Ensin toimimaan, sitten nopeuta
3. Hajota ja hallitse (olioita)
4. Palveluluokka / käyttäjäluokka (sovellus)
5. Luokan nimet itsedokumentoivia
6. Luokka hoitaa yhden selkeän käsitteen
7. Suunnittelu tuottaa luokat, liittymät, suhteet
8. Johdettu luokka yksinkertaistaa ennemmin kuin laajenta
9. Kätke monimutkaisuus luokan käyttäjältä (ohjelmoija)
10. Toistuva koodi metodiksi (bottomup-suunnittelu)
Make 47
Olio-ohjelmointi ohjeita
11. Parametrilistan pitäisi olla lyhyt
12. Aloita yksinkertaisella luokalla
13. Luo testikoodi ennen luokan koodia?
14. Jätä luokkaan testimetodit (main)
15. Korvaa switch ja tyypintutkinta (instanceof) ylimäärittelyllä ja monimuotoisuudella
16. Käytä poikkeushierarkiaa odottamattomille tilanteille (ei harvinaisille)
17. Sun coding conventions java.sun.com/docs/codeconv/index.html
18. Älä käytä unkarilaista nimiöintitapaa (iLaskunumero)
19. Metodi lyhyt ja hoitaa yhden tehtävän
20. Pidä asiat private
Make 48
Olio-ohjelmointi ohjeita
21. Korvaa vakiot symbolisilla vakioilla
22. Konstruktorissa aseta olio kuntoon; vältä kutsumasta metodeita
Make 49
Luentoharjoitus 3
Lottopelissä pelaaja syöttää useita rivejä lottonumeroita. Sen jälkeen arvotaan oikea rivi. Lopuksi tarkistetaan kuinka pelaajaa onnisti.
Suunnittele lottopeliin merkkipohjainen ja graafinen käyttöliittymä. Sijoita lottopelin pelitoiminnot eri luokkaan siten, että molemmat käyttöliittymät voivat käyttää sitä. Minkälainen rajapinta luokkien välille pitäisi määritellä?
Modularisointi
-Vastaus 3
Make 50
Lottoristikko Lotto-numero
t
Syötä rivi
Arvo Tarkasta Talleta rivi
Arvo rivi
Tarkasta1 Syötä numerot
2 Arvo oikeat numerot
3 Tarkasta tulos
Make 51
Luentoharjoitus 4
Laadi autokauppa, joka hallitsee annettua määrää autoja. Kauppaan voidaan lisätä ja poistaa uusia autoja, laskea kaupan autojen keskihinta, listata kalliit (yli keskihintaiset) autot ja etsiä autoja värin mukaan.
Olioita taulukossa
Make 52
Luentoharjoitus 5
Alla oleva Lainaus sovellus käyttää Kirja ja Lainakirja luokkia. Kirjoita Kirja ja Lainakirja luokat.
import java.util.*;public class Lainaus {
public static void main(String[] args) {ArrayList lainassa = new ArrayList();
// add-metodin parametrit ovat teoksen tekijä, nimi ja eräpäivälainassa.add(new Kirja("Vesterholm", "Java-ohjelmointi"));lainassa.add(new Kirja("Lafore", "Data Structures"));lainassa.add(new Kirja("Haikala", "Käyttöjärjestelmät"));lainassa.add(new Lainakirja("Disney", "Aku Ankan vuosikirja 2007", "21.6.2007"));lainassa.add(new Lainakirja("Lordi", "Hard Rock Hallelujah", "31.5.2007" ));lainassa.add(new Lainakirja("Vesterlund", "Jääkiekon pelitaktiikat", "15.5.2007"));
// tulostaa olioiden kaikki tietokentätfor (Object teos: lainassa)
((Kirja)teos).tulosta();}
}
Periytyminen ja monimuotoisuus
Make 53
Luentoharjoitus 6
Kirjoita alla olevan koodin luokat Pankkitili, Asunto ja Sijoitusa. jos Sijoitus on rajapinta luokkab. jos Sijoitus on abstrakti luokka
Abstraktisuus ja rajapinta
Make 55
SWING KÄYTTÖLIITTYMÄ
http://docs.oracle.com/javase/tutorial/uiswing/index.html
”I don’t mean a thing if it ain’t got that swing”
OtaTaiJata.java
Make 56
GRAAFISET KOMPONENTIT
Make 57
Perusnäyttö
JFrame
JMenuBar
ContentPane
JLabel
JToolbarJButton JButton
JSplitPane
JScrollPane JPanel
JPanel
JPanel
JLabel
JScrollPane
JEditorPane
JList
JMenu JMenu
Make 58
Swing komponentteja
JFrameJDialogJAppletJInternalFrameJRootPaneJLayerPaneJDesktopPane
JFileChooserJColorChooserJOptionPane
Katso tutorial-sivu verkosta: docs.oracle.com/javase/tutorial/uiswing/index.htmlSwingComponents.java ja SwingSet3.jnlp
JComponent
AbstractButtonJButtonJMenuItem
JCheckBoxMenuItemJMenuJRadioButtonMenuItem
JToggleButtonJCheckBoxJRadioButton
JTextComponentJTextAreaJEditorPane
JTextPaneJTextField
JFormattedTextFieldJPasswordField
JComboBox
JLabelJListJPopupMenuJProgressBarJScrollBar
JSeparatorJSliderJSpinnerJTableJToolTip
JTree
JPanel
JScrollPaneJSplitPaneJTabbedPaneJMenuBarJToolBar
Make 59
Perusikkunaimport javax.swing.*;import java.awt.*;
public class Perusikkuna extends JFrame {JLabel selite;
public Perusikkuna() {setTitle("Tervehdysikkuna"); selite = new JLabel("Terve");add(selite);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public static void main(String[] args) { Perusikkuna ikkuna = new Perusikkuna(); ikkuna.setSize(200,100); // voisi olla Perusikkuna-konstruktorissa
ikkuna.setVisible(true); }
}Perusikkuna.java
Make 60
AsettelijatAsettelijat.java
Make 61
Layout-ikkunaimport javax.swing.*;import java.awt.*;
public class Layoutikkuna extends JFrame {JLabel selite;
public Layoutikkuna() {setTitle("Tervehdysikkuna");selite = new JLabel("Terve");// BorderLayout sisältöpanelin oletusasettelija// setLayout(new BorderLayout());add(selite, BorderLayout.EAST);// getContentPane().add(selite, BorderLayout.EAST);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {Layoutikkuna ikkuna = new Layoutikkuna();ikkuna.setSize(200,100);
ikkuna.setVisible(true); }
}
Layoutikkuna.java
SpringLayout jdk1.4
http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html
Make 62
Komponenttien suunta ja välit määritellään.
5020 20
20 20
20
SpringAsettelu.java
GroupLayout jdk1.6
Make 63GroupAsettelu.java
PystyryhmätVaakaryhmät
Komponenttien ryhmät vaaka ja pystysuunnassa määritellään (myös välit).
http://java.sun.com/docs/books/tutorial/uiswing/layout/group.html
Make 64
TAPAHTUMIEN KÄSITTELY
Make 65
Kuuntelija
sovellusjvm / WindowListener
addWindowListener()
”tapahtumien postituslista”
windowClosing() metodi
Kuuntelijaksi ilmoittautuminen ja tapahtuman vastaanotto (AWTn event delegation model)
EventObject
Komponentti
Close
käyttöjärjestelmä
Make 66
Ikkunan kuuntelija
Jokainen olio, joka haluaa ottaa vastaan tietyn tapahtuman, ilmoittautuu ko. tapahtuman kuuntelijaksi
addWindowListener(new Kuuntelija())ja toteuttavat liittymän vaatimat metodit, jotka reagoivat tapahtumaan suorittamalla käyttäjän haluamat toimenpiteet, esimerkiksi
windowClosing().
Make 67
Kuuntelija vai adapteri
Koska kuuntelijaksi kirjautuvan sovelluksen pitää toteuttaa kaikki rajapinnan metodit, tarvitsee laatia metodit myös tapahtumille, joista sovellusohjelmassa ei olla kiinnostuneita.
Tämän helpottamiseksi on laadittu Adapteri-kuuntelijaluokat, jossa on tyhjät metodit kaikille pakollisille rajapintametodeille, joten sinun pitää ylikuormittaa sovelluksessa vain tarvitsemasi metodit.
Make 68
Esimerkki (kuuntelija)
import java.awt.event.*;Import java.awt.*;import javax.swing.*;
public class Kuuntelijatesti1 extends JFrame{public static void main(String[] args){
Kuuntelijatesti1 testi = new Kuuntelijatesti1();testi.setVisible(true);
}public Kuuntelijatesti1 (){
addWindowListener(new Kuuntelija()); }}
// Kuuntelija ulkoisena luokkanaclass Kuuntelija implements WindowListener{
public void windowClosing(WindowEvent e){System.exit(0);
}public void windowActivated(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowDeactivated(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowOpened(WindowEvent e){}
}
import java.awt.event.*;Import java.awt.*;import javax.swing.*;
public class Kuuntelijatesti2 extends JFrame{public static void main(String[] args){
Kuuntelijatesti2 testi = new Kuuntelijatesti2();testi.setVisible(true);
}public Kuuntelijatesti2 (){
addWindowListener(new Kuuntelija()); }
// Kuuntelija sisäluokkanaclass Kuuntelija implements WindowListener{
public void windowClosing(WindowEvent e){System.exit(0);
}public void windowActivated(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowDeactivated(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowOpened(WindowEvent e){}
}}
Kuuntelija ulkoisena luokkana Kuuntelija sisäluokkana
Make 69
Esimerkki (adapteri)
…public class Adapteritesti1 extends JFrame{ public static void main(String[] args){ Adapteritesti1 testi = new Adapteritesti1();
testi.show(); }
public Adapteritesti1 (){ addWindowListener(new Kuuntelija()); }}
class Kuuntelija extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0); }}
…public class Adapteritesti2 extends JFrame{ public static void main(String[] args){ Adapteritesti2 testi = new Adapteritesti2(); testi.show(); }
public Adapteritesti2 (){ addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }}
Kuuntelijan laajentaminen adapteriluokasta Kuuntelija nimettömänä sisäluokkana
Make 70
Kuuntelijarajapintoja ja niiden metodejaWindowListenerWindowAdapter
windowOpenwindowClosingwindowsClosedwindowActivated
windowDeactivatedwindowIconifiedwindowDeiconified
Ikkunan avaamisesta, sulkemisesta, aktivoimisesta syntyvät tapahtumat
Kuuntelijatesti2.javaAdapteritesti2.java
ActionListener actionPerformed Komponentin tapahtumat AjanArviointi.java
FocusListenerFocusAdapter
focusGainedfocusLost
Komponentti saa tai menettää fokuksen
KeyListenerKeyAdapter
keyTypedkeyPressed
keyReleased Näppäimistön näppäimen painamiseen liittyvät tapahtumat
MouseListener mouseClickedmousePressedmouseReleased
mouseEnteredmouseExited
Tapahtuvat hiirellä klikattaessa, painettaessa nappi pohjaan, vapautettaessa, tullessa komponentin päälle ja poistuttaessa
MouseMotionListenerMouseMotionAdapter
mouseDraggedmouseMoved
Hiirtä vedetään nappi pohjassa tai liikutetaan
MouseAdapter MouseListenerMouseMotionListenerMouseWheelListener
Hiiri.java
http://download.oracle.com/javase/tutorial/uiswing/index.html
JDK-help java.awt.event
MVC-arkkitehtuuri
Make 71
OsatMalli huolehtii järjestelmän sovellusaluekohtaisen tiedon tallentamisesta, ylläpidosta ja käsittelystä.Näkymä määrittää käyttöliittymän ulkoasun ja mallin tietojen esitystavan käyttöliittymässä.
Ohjain eli kontrolleri vastaanottaa käyttäjältä tulevat käskyt sekä muuttaa mallia ja näkymää vastauksena niihin.
EtujaMalli ei riipu näkymästä eikä ohjaimesta.
Malli voidaan suunnitella, ohjelmoida ja testata riippumatta järjestelmän muista osista.
Samaan malliin voidaan tehdä erilaisia käyttöliittymiä. Saman järjestelmän tietoon voi olla pääsy esimerkiksi merkki-, graafisella ja webbikäyttöliittymällä.
Näkymän ja ohjaimen toimintaan voidaan tehdä muutoksia muuttamatta mallia.
Näkymän ja ohjaimen riippuvuus toisistaan on verrattain pieni.
Käyttöliittymän ulkoasu eli näkymä on mahdollista vaihtaa muuttamatta ohjainta.
Ohjainta voidaan muuttaa muuttamatta näkymää.
Käyttöliittymän asynkronointi on helppoa.Myös muita monitasomalleja.
Loton MVC-esimerkki
Make 72
NÄKYMÄ (VIEW)
OHJAIN (CONTROL)
MALLI (MODEL)
luo näkymäolioluo malliolio
interface
arvo
tarkista
tyhjennä
Rekisteröi viite ohjaimeen
Make 74
Luentoharjoitus 7
Tee rahanvaihtosovellus, jolla voit laskea antamasi euromäärän dollareina ja päinvastoin.
Make 75
Luentoharjoitus 8
Suunnittele GUI-editorilla sovellus, joka laskee kahden kentän arvon yhteen ja pistää tuloksen kolmanteen kenttään.
Make 76
Luentoharjoitus 9
Laadi alla olevan näköinen näyttö, jolla lisäät puhelinluetteloon nimi- ja numerotietoja. Lisää-nappi lisää näyttöön syötetyt tiedot luetteloon. Edellinen-nappi näyttää edellisen numeron luettelosta. Seuraava-nappi näyttää seuraavan numeron luettelosta. Poista-nappi poistaa seuraava- ja edellinen-napeilla haetun nimi- ja numerotiedon luettelosta.
Näyttö pitää koodata ”käsin” eli koodia ei saa generoida graafisella näytönsuunnitteluvälineellä.
Make 77
Luentoharjoitus 10
Ohjelmoi graafinen nelilaskin.
Make 81
POIKKEUSKÄSITTELYLesson: Exceptions (The Java™ Tutorials > Essential Classes)
Make 82
Virheistä
• Ennen hoidettiin paluuarvolla, nykyisin poikkeuksilla• Käännösaikaiset virheet
– Editorin löytämät syntaksivirheet
• Ajoaikaiset virheet– virhetilanne ympäristössä: muisti loppu, tietoväline rikki…– tietovirtavirheet– taulukon rajojen ylitys– nollalla jako– null-viitteet– ohjelmoijan looginen virhe
• Odottamattomiin virheisiin reagoidaan poikkeuksilla
Make 83
Virheen käsittely
try {
// koodi, jossa poikkeus saattaa tapahtua
} catch (poikkeustyyppi poikkeustapahtumaolio) {
// koodi, joka suoritetaan poikkeustilanteessa
} // voi olla useita catch-osia, joista ensimmäinen sopiva valitaan
// poikkeukset pitäisi tutkia tarkimmasta epätarkimpaan
finally { // ei yleensä käytetä
// koodi, joka suoritetaan aina
// yleensä siivoustoimenpiteitä// (tiedoston sulkeminen, resurssien vapauttaminen)
}
…jatketaan tästä
”poikkeuksen sieppaaminen ja hoitaminen”
Make 84
Poikkeusluokkahierarkia
Throwable
Error Exception
RuntimeException(ei-tarkisteta) (tarkistettava)
(ei-tarkisteta)
Make 85
VirhetyyppejäError (virheitä, joista ohjelma ei voi toipua)• OutOfMemory• StackOverFlowError• NoSuchMethodError• NoSuchFieldError• InstantiationError //olio liittymästä tai abstraktista luokasta• IllegalAccessError //metodi tai kenttä johon ei oikeutta• NoClassDefFoundErrorRuntimeException (virheitä, joihin voi reagoida – mutta mitä tehdä?)• ArithmeticException• ArrayIndexOutOfBoundsException• ArrayStoreException //väärän tyyppinen olio taulukkoon• ClassCastException //laiton tyyppimuunnos• IllegalArgumentException //laiton metodiparametri• NullPointerException• NumberFormatException• StringIndexOutOfBoundsExceptionException (virheitä, joista ohjelmoija voi toipua ja jotka on hoidettava)
Javan Exception-poikkeuksia
• IOException• BadStringOperationException• DataFormatException• FontFormatException• GeneralSecurityException• ParseException• PrinterException• SQLException• TimeoutException• UnsupportedAudioFileException• XMLParseException
Make 86
Make 87
Poikkeuksen heittäminen
• Metodin otsikossa luetellaan throws sanan jälkeen kutsujalle heitettävät poikkeukset
• throws-sana pitää olla jos metodi heittää Exception-luokan poikkeuksen (kutsuvan metodin pitää hoitaa se: catch tai throws)
• Metodi voi hoitaa kutsumansa metodin Error ja RuntimeException poikkeuksen vaikkei se sitä throws-sanalla vaatisikaan
• Kutsuva metodi voi heittää poikkeuksen edelleen omalle kutsujalleen
• Kumpi osaa hoitaa – kutsuja vai kutsuttu?
try {virhe
} catch (poikkeus){
}
laske() {
virhe
}
try {
laske();
} catch (poikkeus){
}
laske() throws poikkeus {
virhe
}
laskutus () throws poikkeus
{
laske();
}
try {
laskutus();
} catch (poikkeus){
}
Make 88
Pakollinen poikkeuskäsittely
try {
FileInputStream tiedosto = avaa();
} catch (FileNotFoundException e) {
System.out.println(”Tiedostoa ei löytynyt”);
System.out.println(”Antoi virheen: ”+e.getMessage());
}
public FileInputStream avaa() throws FileNotFoundException, SecurityException {
return new FileInputStream(”dataa.txt”);
}
• Poikkeustapahtumasta saadaan lisää tietoa Throwable- tai sen aliluokan metodeilla, esim: e.getMessage()
• Mitä tapahtuu SecurityExceptionille ?
Make 89
Vapaaehtoinen poikkeus
Taulukkokäsittelyn suojaus:
public class Pelaajat1 { private String[] asiakkaat = {"Kalle","Ville","Matti","Jaska"}; public static void main(String[] args) { Pelaajat1 lista = new Pelaajat1(); lista.tulostaJoukkue(); } public void tulostaJoukkue() { for (int i=0; i<=asiakkaat.length; i++) System.out.println(asiakkaat[i].toUpperCase()); }}
• Ohjelmassa virhe!• Pitäisikö hoitaa poikkeuksilla vai if-lauseella? • Miten poikkeuksella hoitaisit virheen?• Jatkuu harjoituksessa 12
Make 90
Omat poikkeukset
• Tilanne, joka ei hoidu tavanomaisilla ohjausrakenteilla• Odotettavissa olevat tilanteet if-lauseella• Poikkeuskäsittely raskasta• Metodi heittää poikkeuksen kutsujametodille, jos vain metodin
kutsuja tietää tilanteen käsittelytavan• Poikkeukset olioita periytyen java.lang.Throwable luokasta• Oma poikkeus kannattaa periyttää Exception-luokasta• Oman poikkeusluokan nimi olisi hyvä päättyä Exception-sanaan• Dokumentoinnissa mainitse metodin mahdollisesti aiheuttamat
poikkeukset
Make 91
Omat poikkeukset esimerkkitry {
nostaRahaa(1000);} catch (TiliTyhjaException tilipoikkeus) {
System.out.println(”Tililläsi ei ole riittävästi rahaa.”);System.out.println(tilipoikkeus.getMessage());
}
void nostaRahaa(int summa) throws TiliTyhjaException {if (saldo < summa)
throw new TiliTyhjaException(saldo);else
saldo -= summa;}
public class TiliTyhjaException extends Exception {public TiliTyhjaException(saldo) {
super(”Nosto ei onnistu.Tilisi saldo on ”+saldo+” euroa.”);}
}
finally-lausekepublic class TryFinal {
public static void main(String[] args) {
try {
arvonTarkastus(5); // Parametrin arvo määrää mikä poikkeus syntyy
} catch (IllegalArgumentException e) {
System.out.println(”Väärä parametrin arvo");
}
}
public static void arvonTarkastus (int arvo) {
try {
int tulos = 100 / arvo;
if (tulos < 0) throw new IllegalArgumentException();
} catch (ArithmeticException e) {
System.out.println("Nollalla jakoa ei saa tehdä");
} finally {
System.out.println("Olen aivan finaalissa");
}
}
}
Make 92
Make 93
Luentoharjoitus 11a) Minkälaisia poikkeuksia pyydystää seuraava koodin pätkä
catch (Exception e) { koodia}
b) Mikä vikana seuraavanlaisessa poikkeuskäsittelyssä
try {…} catch (Exception e) {…} catch (ArithmeticException a) {…}
c) Minkä tyyppisiä virheitä (1-4) seuraavat tilanteet (a-d) ovat
a. int[] a; 1. errora[0] = 0; 2. tarkistettava virhe
b. JVM ei löydä Javan luokkia. 3. kääntäjän virhe c. Ohjelma saavuttaa tiedoston loppumerkin. 4. ei ole virhed. Ohjelma yrittää lukea tiedostoa vaikka on
jo sen lopussa.
Make 94
Luentoharjoitus 12
1. Lisää Pelaaja1 luokan tulostaJoukkue() metodiin taulukon takarajan ylitys poikkeuskäsittely
2. Lisää myös puuttuvan pelaajan poikkeuskäsittely
3. Siirrä taulukon ylitys poikkeuskäsittely Pelaaja1 luokan main-metodiin
Make 95
TIEDOSTOT
Make 96
Tietovirta
Tietovirta
Tieto keskusmuistissa
Tieto pysyvässä muistissa
Tiedosto
MerkkivirtaBinäärivirta
AvaaminenKirjoittaminenLukeminenSulkeminen
Tietue
Make 97
Kirjoitusluokat
MERKKIVIRTA
WriterFileWriterBufferedWriter
BINÄÄRIVIRTA
OutputStream
FileOutputStreamBufferedOutputStream
Make 98
Esimerkki merkkien kirjoittamisestaimport java.io.*;
public class Tiedostoonmerkit {
public static void main(String[] args){Writer ulos;BufferedWriter puskuri;try {
ulos = new FileWriter("Merkit.txt");
puskuri = new BufferedWriter(ulos);puskuri.write("Tässä on tulostettavia merkkejä”);puskuri.newLine();puskuri.close();
} catch (IOException ioe) {ioe.printStackTrace();
}}
}
Make 99
Esimerkki binääridatan kirjoittamisestaimport java.io.*;
public class Tiedostoontavut {
public static void main(String[] args){
OutputStream virta;
Writer ulos;
BufferedWriter puskuri;
try {
virta = new FileOutputStream("Tavut.txt");
ulos = new OutputStreamWriter(virta);
puskuri = new BufferedWriter(ulos);
puskuri.write("Tässä on tulostettavia tavuja");
puskuri.newLine();
puskuri.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
Make 100
Lukemisluokat
MERKKIVIRTAReader
FileReaderBufferedReader
BINÄÄRIVIRTAInputStream
FileInputStreamBufferedInputStream
Make 101
Esimerkki merkkien lukemisesta
import java.io.*;
public class Tiedostostamerkit {
public static void main(String[] args) {
BufferedReader puskuri;
String rivi;
try {
puskuri = new BufferedReader(new FileReader("Merkit.txt"));
while ((rivi=puskuri.readLine()) != null){
System.out.println(rivi);
}
puskuri.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
}
Make 102
Esimerkki binääridatan lukemisesta
import java.io.*;
public class Tiedostostatavut {
public static void main(String[] args) {
BufferedReader puskuri;
String rivi;
try {
puskuri = new BufferedReader(new InputStreamReader( new
FileInputStream("Tavut.txt")));
while ((rivi=puskuri.readLine()) != null){
System.out.println(rivi);
}
puskuri.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
}
Make 103
Esimerkki try-with-resource
import java.io.*;
public class TryWithResource {
public static void main(String[] args) throws IOException {
String rivi;
try (BufferedReader lukija = new BufferedReader(new FileReader("Merkit.txt"))) {
while ((rivi = lukija.readLine()) != null)
System.out.println(rivi);
} // Heittää poikkeuksen jos tiedostoa ei löydy tai
// tiedoston sulkemisessa tapahtuu virhe
}
}
• Jokainen olio, joka täytyy sulkea on resurssi• Try sulkee resurssin try-lauseen jälkeen• Suljettavien resurssien täytyy toteuttaa AutoCloseable tai Closeable rajapinta• Useita resursseja: try (InputStream fis = new FileInputStream(source);
OutputStream fos = new FileOutputStream(target)){...
Make 104
Olioiden lukeminen ja kirjoittaminen
Sarjallistamisella olio kokonaisuudessaan kirjoitetaan tiedostoon ja se pystytään myös palauttamaan ohjelmaan entiseen muotoonsa.
Luokat: ObjectInputStream
ObjectOutputStream
(sarjallistaminen)
Make 105
public class Auto implements Serializable {String merkki;public Auto(String m){
merkki = m;}
}
Olion sarjallistaminen
try {FileOutputStream out = new FileOutputStream(”kulkuneuvot.dat”);ObjectOutputStream olioout = new ObjectOutputStream(out);Auto oma = new Auto(”Volvo”);olioout.writeObject(oma);olioout.close();
} catch (IOException ioe){System.out.println(ioe.getMessage());
}
try {FileInputStream in = new FileInputStream(”kulkuneuvot.dat”);ObjectInputStream olioin = new ObjectInputStream(in);Auto car = (Auto)olioin.readObject();olioin.close();
} catch (IOException ioe){ioe.printStackTrace();
}
Make 106
File-luokka
Käsittelee tiedostoja ja hakemistoja.• File(String), File(String, String)• boolean exists()• boolean isDirectory()• boolean isFile()• boolean delete()• boolean mkdir()• boolean mkdirs()• boolean renameTo()• …
Make 107
Luentoharjoitus 13
Lue rivejä kahdesta tiedostosta ja kirjoita ne kolmanteen tiedostoon. Luettavien tiedostojen tietueiden alussa on numerokenttä, jonka mukaan ne ovat järjestyksessä.
Make 108
Luentoharjoitus 14
Serialisoi olioiden taulukko tiedostoon.
Make 109
Luentoharjoitus 14.2
Testaa JFileChooser komponenttia.
Make 110
UMLUnified Modeling Language
Make 111
Vaatimukset tietojärjestelmäksi
”Järjestelmä-malli”
”Ohjelmisto-malli”
Tieto ↔ Toiminta(objekti)
”Toimintomalli”
”Tietokanta-malli”
”Käsitemalli”
Make 112
Ohjelmiston kehitysvaiheet
1. Esitukimus (Vaatimusmäärittely (mitä, mahdollista))
2. Analyysi (käyttötapauskaavio, luokkakaavio, attribuutit)
3. Suunnittelu (sekvenssikaavio, tarkennettu luokkakaavio)
4. Toteutus
5. Testaus
6. Käyttöönotto
7. Ylläpito
”Tehdäänkö?”
”Mitä?”
”Miten?”
”Miten javalla?”
Kehitystapa
• Vesiputousmalli• Spiraalimalli
– Inkrementaalinen (lisäävä, täsmentävä)– Iteratiivinen (toistava)
• Agile (ketterä), Scrum, XP, …– Muutokseen reagointi (suunnitelma)
• Nopea palautesykli, pienet tuotantoerät, vaatimuksien priorisointi, hinta-/aikavaikutukset
– Vuorovaikutus (työkalut)• Vertaisarviointi, itseohjautuvat tiimit
– Asiakasyhteistyö (sopimukset)• Tuoteomistaja, jatkuva mukanaolo, kiinteä projekti / muutosjoustavuus
– Toimiva sovellus (dokumentaatio)
Make 113
Make 114
Kaavioiden tarkoitus
Mallintaminen• Ymmärrä, yksinkertaista, kommunikoi• Hierarkiset kaaviot
Dokumentointi • Kuvaus, koulutus, työvaiheen tulos
Koodin tuottaminen• Nopeus, muuttaminen• Vaatimusten mallintaminen: käyttötapauskaavio• Rakenteen mallintaminen: luokkakaavio• Vuorovaikutuksen mallintaminen: sekvenssikaavio• Käyttäytymisen mallintaminen : tilakaavio
Make 115
Olioperustainen kuvaus
• ”Three Amigos” = Rumbaugh, Booch, Jacobson 1996• UML on notaatio – ei menetelmä• Kaikkea ei tarvitse käyttää tai osata• UML tukee hyvin oliopohjaista ohjelmankehitystä• Kuvauksen jälkeen toteuttaminen helppoa• Oliot heijastavat sovelluksen käsitemaailmaa
luontevasti• Olio sisältää käsitteen tiedot ja toiminnan• Arkkitehtuuri → suunnittelumalli (pattern, frame,
template) → algoritmi → tietorakenteet
UML kaaviot
Make 116
Make 117
UML-kaaviot
UML
Rakennekaavio(Object)
Luokkakaavio
Koostekaavio
Komponenttikaavio
Sijoittelukaavio
Pakkauskaavio
Käyttäytymiskaavio(Functional+Dynamic)
Aktiviteettikaavio Vuorovaikutuskaavio
Sekvenssikaavio
Kommunikointikaavio
Kokoava vuorovaikutuskaavio
Ajoituskaavio
Käyttötapauskaavio Tilakaavio
Make 118
UML-kaaviot• Käyttäytymiskaavio (Behaviour diagram)
• Aktiviteettikaavio (Activity diagram)• Käyttötapauskaavio (Use case diagram)• Tilakaavio (State diagram)• Vuorovaikutuskaavio (Interaction diagram)
• Ajoituskaavio (Timing diagram)• Kokoava vuorovaikutuskaavio (Interaction overview
diagram)• Kommunikointikaavio (Communication diagram)• Sekvenssikaavio (Sequence diagram)
• Rakennekaavio (Structure diagram)• Komponenttikaavio (Component diagram)• Koostekaavio (Composite structure diagram)• Luokkakaavio (Class diagram)• Oliokaavio (Object diagram)• Pakkauskaavio (Package diagram)• Sijoittelukaavio (Deployment diagram)
Make 119
Käyttötapauskaavio
Actor ulkopuolinen toimija
<<extends>>
laajentaa, poikkeustapaus
<<includes>> tai <<uses>>
käyttää erillistä käyttötapausta
Use case
Käyttötapauskuvaus on käyttötapauskaavion sanallinen tarkennus• Strukturoitu teksti• Toimintoluettelo
Make 120
Peruselementtejä
LuokkaTiedot
ToiminnotRakenne
TilaKäyttäytyminen
Kommentti
PakkausRyhmittely
Kommentti
• Yksinkertainen assosiaatio (association)
public class Tilaus {
private Asiakas asiakas;
• Moninkertainen assosiaatio
public class Kurssi {
private Opiskelija[] osallistujat = new Opiskelija[50];
Assosiaatio
Make 121
Kurssi Opiskelija1..500..* ◄ osallistuu
maksaja
Asiakas Tilaus1..*1 suorittaa
public class Opiskelija {
private ArrayList ilmoittautumiset;
Kooste
• Kooste (aggregation)
public class Koulutusohjelma {
private ArrayList kurssilista;
// Konstruktori voisi vaatia koulutusohjelmalle vähintään yhden kurssin
public void LisääKurssi(Kurssi kurssi) {
kurssilista.add(kurssi);
• Vahva kooste (muodoste, composition)
”lapsi ei voi elää ilman isää eikä kuulua muihin isiin ”
public class Opiskelija{
private ArrayList ilmoittautumiset;
public void Ilmoittaudu() {
ilmoittautumiset.add(new Ilmoittautuminen());
Make 122
Opiskelija Tentti-ilmoittutuminen1..*1
Koulutusohjelma Kurssi1..**
Periytyminen• Yleistys (generalization, inheritance)
public class Tentti extends Suoritus {
• Abstrakti luokka (abstract class) public abstract class Suoritus {
public abstract void laskeOv();
}
public class Tentti extends Suoritus{
public void laskeOv() {
…}
}
• Rajapinta (interface ja implementation)public interface Suoritus {
//metodien määrittely
}
public class Tentti implements Suoritus {
// metodien toteutukset
}
Make 123
Suoritus
Tentti
Suoritus
laskeOv()
Tentti
laskeOv()
<<interface>>Suoritus
Tentti
italic
Make 124
LuokkakaavioLuokat- käsite- määrittely (rajapinta)
- toteutus
Yhteydet (assosiaatiot)
- viite- alityyppi
Tiedot (attribuutit)
- näkyvyyspublic +protected #private –package ~static (alleviivaus)- nimi (java
notaatio)- tietotyyppi
Toiminnot (metodit)
- näkyvyys- nimi- parametrityypit- palautetyyppi
Make 125
VuorovaikutuskaavioSekvenssikaavio
Asiakas Automaatti TilitietokantaSyötä kortti
Kysy tunnusluku
Syötä tunnusluku Tarkista käyttäjä
Käyttäjä okKysy nostettava määrä
Syötä summa Tarkista summa
Summa hyväksytty ja vähennettySyötä kortti ulos
Näytä saldo ruudulla
Anna rahat
Hyvästele asiakas
Rahan nosto automaatista
Make 126
Tilakaavio
Kuvaa yksittäisen olion täydellisen käyttäytymisen
lopputila
alkutila
Make 127
Tilakaavio
Laskun elinkaari
Luotu
Lähetetty
Maksettu
Arkistoitu
Maksamatta
Kehotus
Suoritettu Perintä
kk-ajo
postitettu
suoritettu
vuosi kulunut
eräpäivä
suoritettu
kuukausi kulunut
oikeuden päätös
suoritettu
ei suoritettu
6 kuukautta
vuosi kulunut
2 kertaa
Ulosottorealisoitu
Make 128
Komponenttikaavio, pakkauskaavio
• Komponentti kokoaa yhteen saman asian luokat ja tarjoaa käyttäjälle itsellisen, helppokäyttöisen palvelun (määritelmäni eroaa UML:stä)
• Pakkauskaavio ryhmittelee yhteenkuuluvat luokat ylläpitäjän näkökulmasta samaan hakemistoon (namespace, package)
Make 129
Luentoharjoitus 15
Piirrä LUOKKAKAAVIO lukujärjestys-ohjelmaa varten. Lukujärjestyksiä pitäisi saada opiskelijaryhmälle, opettajalle sekä luokkahuoneelle.
Make 130
Luentoharjoitus 16
Piirrä TILAKAAVIO ihanteellisesta, television kauko-ohjaimen toiminnasta. Ohjain ohjaa televisiota ja tallentavaa digiboxia.
Make 133
TIETOKANTALIITTYMÄ
Make 134
Tietokanta ja rajapinta
Java-ohjelma Java-ohjelma
JDBC API
JDBC-ODBC
silta
Access-ODBCajuri
Oracle-ODBCajuri
Oracleajuri
MySQLajuri
MySQLOracleAcess
Tietokanta -palvelinsovellukset
Miksa 135
Make 136
MySQL asennus Win -koneeseen
1. Asenna MySQL www.mysql.fi sivulta* Hallinta:
Control panel+Adminstrative tools+Services Automatic/manual/start/stop
2. Asenna joku graafinen hallintatyökalu MySQL workbench (MySQL Administrator + MySQL Query Browser) HeidiSQL Sql-Front Netbeans Workbench
3. Luo tietokanta Käynnistä / MySQL / MySQL Server 5.0 / MySQL Command Line
Client ja kirjoita
CREATE DATABASE javatesti;
GRANT ALL PRIVILEGES ON javatesti.*
to testaaja@localhost identified by ’sala’;
*Win7: Administrator-oikeuksilla
Make 137
Yhteys tietokantaan
Class.forName(”com.mysql.jdbc.Driver”).newInstance();
// tai lataa mysql-connector-java-5.0.5-bin.jar MySQL-sivuilta
// projektin library-polkuun (ajoaikana CLASSPATH)
MySQL JDBC-ajurin lataaminen (rekisteröinti):
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();
JDBC-ODBC-sillan lataaminen:
// jdbc:driverityyppi://kone:portti/tietokanta
String url = ”jdbc:mysql://localhost/javatesti”;
con = DriverManager.getConnection(url, ”testaaja”, ”sala”);
// DriverManager luokka voidaan korvata uudemmalla DataSource
// rajapinnalla (joka käyttää yhteysallasta)
Yhteys tietokantaan:
Yhteys tietokantaan 193.167.92.152
• Opiskelijoiden käyttöön tarjolla Linux –palvelin.
String url = "jdbc:mysql://193.167.92.152/javatesti";
con = DriverManager.getConnection(url, "testaaja", "salasana");
– Tietokanta: javatesti– Tunnus: testaaja– Salasana: salasana
• Tietokantaa saa vapaasti käyttää TTY:n verkosta• Tietokannan ylläpitäjältä (Mika) saa uusia tunnuksia
mikäli tarpeen.• Tietokannan ylläpitäjä ei vastaa tietojen säilymisestä…
Make 138
Make 139
Luo SQL- taulu
CREATE TABLE TUOTTEET (
TID INTEGER NOT NULL PRIMARY KEY,
NIMI VARCHAR(40) NOT NULL,
HINTA FLOAT,
LKM INTEGER DEFAULT 0
);
Make 140
Luo SQL-indeksit
CREATE INDEX TNIMI ON TUOTTEET(NIMI);
Make 141
SQL-tietuetoiminnot
INSERT INTO TUOTTEETVALUES (1, ’Korppu’, 2.50, 10);
LISÄYS
PÄIVITYS
POISTO
INSERT INTO TUOTTEET (TID, NIMI, HINTA)
VALUES (2, ’Romppu’, 7.50);
UPDATE TUOTTEETSET HINTA = 6.50, LKM = 100WHERE TID = 2;
DELETE FROM TUOTTEETWHERE TID = 1;
Make 142
SQL-kysely
SELECT *FROM TUOTTEET;
Kaikki tietueet,kaikki kentät
SELECT TID, NIMI, HINTAFROM TUOTTEET;
Kaikki tietueet,
tietyt kentät
SELECT *FROM TUOTTEETWHERE HINTA < 10 AND LKM >100;
Ehdon tietueet
SELECT *FROM TUOTTEETORDER BY HINTA, NIMI;
Tietueet järjestyksessä
SELECT A.ENIMI, A.SNIMI, T.PVMFROM ASIAKKAAT A, TILAUKSET TWHERE A.ANO = T.ANO;
Tietueita useasta taulusta
Make 143
Kysely
• Statement– Connection.createStatement()– executeUpdate() // muuttaa kantaa– executeQuery() // palauttaa tietoa kannasta– Close() // sulje statement finally-
lohkossa
Make 144
Tulosjoukko
• ResultSet– ResultSet rs = stmt.executeQuery(”Select…”);– while (rs.next())– Getxxx() // numerolla tai nimellä– Statement-oliolla vain viimeinen resultset-joukko– Metadatalla yleisiä resultset-käsittelijöitä– createStatement() antaa resultsetille ominaisuuksia
• Selaustapa, päivitettävyys, yhteyskantaan
– Suoraan tiettyyn riviin– Kannan päivitys resultsetin kautta– Uusia/omia tietotyyppejä– Tietolähde (DataSource) erikseen yhteydestä (Connection)
Tietokanta2.java, Tietokanta3.java
Make 145
Valmistellut kyselyt
• PreparedStatement– PreparedStatement kysely =
Connection.prepareStatement(”Select ?...”);– Kysely.setInt(1, arvo);– ResultSet rs = kysely.executeQuery();
Make 146
TapahtumatTapahtuma alkaa: Connection.setAutoCommit(false);
Tapahtuma päättyy: Connection.commit();
Tapahtuman peruutus: Connection.rollback();
Tapahtumien eristyvyystasot: Connection.setTransactionIsolation(Connection.TRANSACTION_NONE);
TRANSACTION_NONE
A constant indicating that transactions are not supported.
TRANSACTION_READ_COMMITTED
A constant indicating that dirty reads are prevented; non-repeatable reads and phantom reads can occur. This level only prohibits a transaction from reading a row with uncommitted changes in it.
TRANSACTION_READ_UNCOMMITTED A constant indicating that dirty reads, non-repeatable reads and phantom reads can occur. This level allows a row changed by one transaction to be read by another transaction before any changes in that row have been committed (a "dirty read"). If any of the changes are rolled back, the second transaction will have retrieved an invalid row.
TRANSACTION_REPEATABLE_READ
A constant indicating that dirty reads and non-repeatable reads are prevented; phantom reads can occur. This level prohibits a transaction from reading a row with uncommitted changes in it, and it also prohibits the situation where one transaction reads a row, a second transaction alters the row, and the first transaction rereads the row, getting different values second time (a "non-repeatable read").
TRANSACTION_SERIALIZABLE
A constant indicating that dirty reads, non-repeatable reads and phantom reads are prevented. This level includes the prohibitions in TRANSACTION_REPEATABLE_READ and further prohibits the situation where one transaction reads all rows that satisfy a WHERE condition, a second transaction inserts a row that satisfies that WHERE condition, and the first transaction rereads for the same condition, retrieving the additional row ("phantom“) in the second read.
Make 150
Luentoharjoitus 17
Listaa asiakkaat.
Make 151
Luentoharjoitus 18
Listaa asiakkaan tilaamat tuotteet. (Ei duplikaatteja.)
Make 152
Luentoharjoitus 19
Luodaan tietokantaa käyttävä sovellus eläinkaupalle. • Tekstipohjainen käyttöliittymä: Elainkauppa.java• Tietokannassa Pet-taulu:
int PetID NOT NULL AUTO_INCREMENT
Name varchar(255)AnimalName varchar(255)PRIMARY KEY(PetID)
• Tietokanta.java – LuoYhteys() ja suljeYhteys()– luoTietokanta(), TuhoaTietokanta()– Lisaa(), Poista(), muuta()– TulostaKaikki(), Tulostajarjestyksessa()
• Tulokset hakemistossa: luento9Tietokanta
Make 158
OHJELMIEN DOKUMENTOINTI
Make 159
Javadoc
• Voit lisätä erikoiskommentteja ohjelmaasi, joista javadoc-ohjelma pystyy laatimaan dokumentaation html-muotoisena.
/** * Kuvataan dokumentoitavan kokonaisuuden toiminta * (luokka, metodi, tietokenttä) *
* @tag kuvausta tagin osoittamasta asiasta * <i>tekstiä voi muotoilla html tageilla</i> */
Make 160
Javadoc tageja
@author
@version
@see@since versio
@deprecated
@param
@return
@exception
Javadoc –sourcepath <hakemistot> -d <hakemistot> tiedostot
@see #metodi@see omat.Luokka@see Integer@see Luokka#metodi@see Integer#MAX_VALUE
Luokat ja liittymät Lisäksi metodeissa
Make 161
Esimerkki luokkakommenteista
/**
* Laskee lainan kuukausimaksun tasaeräperiaatteella
*
* @author Markku Nevanranta
* @version 11.12.2009 alv-muutosten jälkeen
*
*/
Make 162
Esimerkki metodikommenteista
/**
* Laskee jakson koron pääomalle
*
* @param velka Lainan määrä
* @param pros Vuosikorko väliltä 0-100
* @param jaksot Maksukausien määrä
* @return Koron osuus kauden lyhennyksestä
*
*/
Make 163
Javadoc Eclipsessä
• Dokumentaatio syntyy oletusarvoisesti projektin doc-hakemistoon
• Javadoc-näkymä näyttää dokumentaation hiirellä valitulle komponentille
• Popup-ikkuna näyttää kun osoitin on komponentin päällä
• Selain näyttää komponentin dokumentaation SHIFT+F2
• Eclipsen selain-ikkuna aukeaa index.html valinnasta
• Esimerkki: Pankkitili2.java
Make 164
Javadoc Netbeansissä
• Dokumentaatio syntyy oletusarvoisesti projektin dist-hakemistoon
• Osoita editorissa elementtiä, josta haluat dokumettitietoa ja käytä jotakin seuraavista tavoista
1. Hiiren oikealla näppäimellä > Show Javadoc
2. Source > Show documentation (Ctrl+Shift+space)
3. Alt+F1
4. Window > Other > Javadoc
• Esimerkki: Pankkitili2.java
Make 165
Luentoharjoitus 19
Lisää javadoc-tagit johonkin luokkaasi ja aja javadoc.
Make 166
SÄIKEET
Säikeen tilat
Make 167
new
runnable
terminated
blocked
ready runcomplete
I/O request
yield()
jvm skeduloi
sleep()
wait()
join()
notify()
notifyAll()
Säikeiden hallinta
start() Käynnistää säikeen
stop() Pysäyttää säikeen
run() Metodi, joka säikeen oliossa käynnistyy
yield() Luopuu suoritusvuorostaan toisten säikeiden hyväksi
sleep() Nukuttaa säikeen annetuksi millisekunttien ajaksi
join() Odottaa annetun ajan (tai ikuisesti) säikeen päättymistä
wait() Laittaa säikeet odottamaan notify() tai notifyAll() kutsua
notify() Herättää oliota odottavista säikeistä yhden satunnaisesti
notifyAll() Herättää kaikki oliota odottavat säikeet
setPriority() Asettaa säikeen prioriteetin
Make 168
Thread-luokkaThread-luokkapublic class Saie1 extends Thread {
public void run(){
System.out.println(”Tämä on säie”);
}
}
Saie1 säie = new Saie1();
säie.start();
Make 169
Runnable-rajapintapublic class Saie2 implements Runnable {
public void run(){
System.out.println(”Tämä on säie”);
}
}
Saie2 oma= new Saie2();
Thread säie = new Thread(oma);
säie.start();• Main on säie• Roskien keruu on säie
Säieluokat ja rajapinnat
Thread-luokka– Thread-luokka implementoi Runnable-rajapinnan– Rajapinta vaatii run-metodin, josta suoritus alkaa– Priorities
• MIN_PRIORITY=1, NORM_PRIORITY=5, MAX_PRIORITY=10• Säie perii luojansa prioriteetin• saie.setPriority(int prio); saie.getPriority();• Käyttöjärjestelmä jakaa java-prosessille aikaa, java (JVM) jakaa säikeille aikaa
– Ei tasojen välistä aikajakoa– yield() ei päästä matalamman prioriteettisia ohi– Kiertovuorottelu (round-robin) kullakin prioriteettitasolla– Pre-emptive (korkeamman prioriteetin työ keskeyttää)
• Säie päättyy kun run() päättyy• ”Ikuinen silmukka” voidaan päättää ulkoapäin volatile boolean muuttujan avulla
Make 170SaieTesti1.java
Synkronointi
• Monitori-koodi valvoo jakamattoman resurssin käyttöä• Monitorin sisällä kriittisestä koodista on tehtävä atominen
operaatio eli yksi säie suorittaa sen alusta loppuun keskeytyksettä (transaktio)
• Monitorin kriittinen koodi ympäröidään ”synchronized”-määreellä (metodi tai koodilohko)
• ”Synchronized” päästää vain yhden säikeen kerrallaan kriittiseen koodiin ja jättää muut odottamaan vuoroaan
• Monitori on oliokohtainen (suojelee yhtä resurssia)• Yhdellä oliolla voi olla vain yksi monitori (samaa resurssia ei
voi suojella monta monitoria)
Make 171
Synkronointi
public synchronized void metodi(){
// tähän metodiin pääsee yksi olio kerrallaan
}
Make 172Monitori.java
synchronized (olioviite){
// tähän lohkoon pääsee yksi olio kerrallaan
}
synchronized (this){
tunnus = opno++;
}
Rinnakkaisuus API
Executor-rajapinta– java.util.concurrent package– Säieallas luo tehokkuutta ja helpottaa säieohjelmointia laajoissa
säikeitä käyttävissä sovelluksissa– Uudet sisäiset rinnakkaisuuteen sopivat tietorakenteet auttavat
ylikuormitustilanteiden hallintaa– Rajapinta vaatii execute-metodin– Executors-luokka on Executer-olioiden ”tehdas”, joka tarjoaa
staattisia palveluja– Esim: ConcurrentHashMap, AtomicInteger,...– ExecutorService-rajapinta laajentaa Executoria ja antaa lisäpalveluja
Make 173
SaieTesti2.java
java.util.concurrent
Swing-synkronointi
1. Jos usea säie päivittää käyttöliittymää saattaa tiedot sekoontua– Näyttöä hoitaa yksi GUI-tapahtumia käsittelevä säie– Useimmat Swingin GUI-komponentit eivät ole synkronoituja– Synkronoi käyttöliittymää hoitava luokka tai metodit
2. Laskentaosa ei saisi pysäyttää käyttöliittymän toimintaa– SwingWorker-luokka hoitaa omassa säikeessään
aikaavievät laskennat ja kommunikoi käyttöliittymäsäikeen kanssa metodeilla
• doInBackground, execute, done, get, publish, process
Make 174Flipper1.java
Make 175
Luentoharjoitus 20
Tee graafisia komponentteja, joita päivitetään eri prioriteettisilla säikeillä. Tutki metodien sleep(), wait(), join(), notify(), notifyAll(), yield() toimintaa. Hidasta säikeiden toimintaa sleep()-metodilla, jotta ehdit huomata metodien vaikutuksen.