Sveu£ili²te u Zagrebu Fakultet elektrotehnike i ra£unarstva

Marko Topolnik

Uvod u programski jezik Java
Skripta uz kolegij Seminar Java+XML

Zagreb, 2005.

Sadrºaj

Predgovor Uvod 1 Osnovni elementi jezika Java
1.1 1.2 Objektna paradigma, enkapsulacija . . . . . . . . . . . . . .

ix 1 3
3 5 6 6 7 8 9 11 13 18 20 23 23 24 25 25 26 26 28 30

Pokretanje programa pisanih u Javi . . . . . . . . . . . . . . 1.2.1 1.2.2 Rad u naredbenom retku . . . . . . . . . . . . . . . . Rad u okruºju

Eclipse

. . . . . . . . . . . . . . . . .

1.3 1.4 1.5 1.6 1.7 1.8 1.9

Pojam klase . . . . . . . . . . . . . . . . . . . . . . . . . . . Povezivanje objekata, izgradnja objektnog sustava . . . . . . Inicijalizacija objekta konstruktorom Povezivanje objekata agregacijom . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

Polimorzam i Javino su£elje . . . . . . . . . . . . . . . . . . Izbjegavanje ponavljanja koda naslježivanjem . . . . . . . .

Klasna hijerarhija, apstraktna klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.10 Paketi, imenovanje klasa i su£elja 1.10.1 Koncepcija paketa

. . . . . . . . . . . . . . . . . . .

1.10.2 Pravila imenovanja paketa . . . . . . . . . . . . . . . 1.10.3 Pravila za raspored datoteka po kazalima . . . . . . . 1.10.4 Uloga paketno-privatne razine dostupnosti 1.11 Refaktorizacija . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

1.11.1 Modikator

final 

kontrola polimorzma . . . . . .

1.12 Uvoženje vi²e varijanti iste metode  preoptere¢enje . . . . . 1.13 Prijelaz s agregacije na kompoziciju  kopiranje objekata . .

2

Razrada detalja jezi£nih svojstava
2.1 Varijabla, referenca, objekt . . . . . . . . . . . . . . . . . . . 2.1.1 Varijabla primitivne vrste . . . . . . . . . . . . . . .

33
33 33

i

. .2. . . . . . . . . . . . .4 2. . . . . .3. . . . . . . . . . . . . . . Uvjetni (ternarni) operator . . . . . . Provjera jednakosti znakovnih nizova Nepromjenjivost instanci String-a . .3 3. . . . . . .12.3 Varijabla referentne vrste . . . .3. . . . Opseg vidljivosti ( 34 35 36 37 37 38 39 39 39 40 43 45 46 46 48 49 49 50 51 52 53 55 55 55 56 57 scope ) lokalne varijable . . . . . . . . . . .3 2. . . .4 Klasa 59 59 62 62 64 66 66 67 68 69 java. . . .2. . . . . . . . . . . . . . . . . Metoda hashCode . . . . . . . . . . . . .8. . . . konstanta . . . .1 Korijenska klasa Object . .2 2. . . . . . . . . . . . . . .2 Uvodne upute za snalaºenje u Javinoj dokumentaciji API-ja Klasa 3. . . . . . . . . Primitivne vrste podataka . . . .13 Java kao softverska platforma . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . . . . . . . . 2. . . .7 2. . . . . 2. . . . . . . . . . . . . . . . . . . . . . . . . instanceof this 2.2 3. . . . . . .Object Metoda equals . . . . . . . . . . . . . . .1 Modikator final  rekapitulacija . . . . . . . . . . . . . . 2. .10. . . . . . Upcast i downcast 2. Model klasne enkapsulacije . . . . . . . .4 2. . . . . . . . . . . . . . . java. . . .2 3.8 Stati£ka metoda  izuzeta od polimorzma . . . . Pretvorbe izmežu numeri£kih vrsta . . . . . . .1. . . .11 Implicitni parametar metode  2. . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Denicije izraza vezanih uz hijerarhiju 2. .9 2. . . . . . . . .12. .3 Klasa 3. . . . . . . . . . . . . . . . . . 2. . . .10 Pravila oblikovanja identikatora . . . System . . . . . . . . . . . . . . . . 3 Najvaºnije ugražene klase 3. . . . . . . . .2 2. . . . . . . .1 2. . Operatori sloºene dodjele . . Sve razine dostupnosti 2. . . . . .5 Numeri£ki operatori Logi£ki operatori . . . . . . . . . Stati£ki atribut. .3. . . .1 3. .11.12. . . . . . . . . . . . .String . . . . . . . .3. . . .3. . . . . . . . 2. . . . . .lang. . . . . . . Metoda toString . .1 . . .ii SADRšAJ 2. 2. . . . . . . .1 3. . . . . . . . . . Konstrukcije za upravljanje slijedom izvr²avanja . .1 3. . . . . . . . . . . . . . .5 2.2. . .12 Detalji o hijerarhiji klasa . . . . . . . . . . . .lang.3. . . . . . . . . . . . . . . . .2 2.1 Operator . . . .6 Enumeracija . . . . . . .1. Numeri£ki i logi£ki izrazi .3 Ulan£avanje poziva konstruktora 2. i polimorzam 2. . . . . . . . . . . . .3 2. . . . . . . . . .1 Parametar this . 2. . . . . .

. . . . . .5 Tokovi podataka Pisa£i i £ita£i 103 .4 7. .6 Su£elja 87 . . 4 Iznimke 4. Hvatanje iznimke  obrada iznimne situacije Zavr²ne radnje prije bacanja iznimke  blok Vi²estruki blokovi . . .3 Osnovni elementi sintakse . . .5. . . . . . . . . . . .6. . . . .7 Klasna hijerarhija iznimki Kori²tenje ugraženih i vlastitih iznimki . . . . . . . . . . . .1 7. .3 Primjer kori²tenja metode . . . . . . . . . . . .SADRšAJ iii 3. . . . 101 Interakcija s kolekcijama . . . . . . . . . . . . . . . . . . . . .1 5. . . . . . . . . autoboxing . . . . . . . Poredak razli£it od prirodnog  su£elje java. . . . . . .6 Klase-omota£i primitivnih vrsta. . . . . . . . . . .1 4. . . . . .3 5. . . .util.4 4. . . . . . . . . Najava iznimke. . . .4 5. . . . . . . . .6. . . . . . . . . . . . . . . . . . . . . . 104 Komunikacija s korisnikom . . . . . . . . . 101 7 Komunikacija s okolinom 7. . . . . . . . .2 7. . . . . . . . . . .5 Bacanje iznimke  prijava iznimne situacije . . . . . . . . . . . . . . . . . . . . . . . 106 Rad s datotekama . . . . . . 87 90 91 92 93 94 94 Collection. . . 95 96 Collections. . . . . . Mapa . . . . . . . . . . . 99 99 Polje kao objekt . . . .3 4. . . 4. . . . . . . . . . . . . . . . . .Comparable<T> .2 4. . . . . . catch . .1 6. .6 4. .5 5. . .sort 6 Polja 6. . . . . . . . . .2 Implementiranje su£elja java. . . . . .5 3. . . . List i Set Prelazak preko svih £lanova kolekcije Kolekcije i primitivne vrste podataka Napredni prelazak po £lanovima kolekcije . .2 5.6. .Comparator<T> 5. . . . . . . . . .1 Najava vi²e iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 . . . . . .lang. . . . . . . . . . . . . . . . . . 5 Kolekcije objekata 5. . . . . . . 107 Rad s internetskim konekcijama . 73 74 76 78 79 81 82 82 83 finally . ƒesto kori²teni algoritmi nad kolekcijama . .2 6. . . . . . . . . 107 . . . .1 5. . . 5.3 7. . . . . . . . . . . . 69 70 Konverzija izmežu podatka i njegovog znakovnog zapisa . . . . provjeravana i neprovjeravana iznimka 4. . . . . . . . . . .

. . . . . . . .1 8. . 121 Literatura 123 . . . . . . . .2 9. . . . . . . . . . . . . . . . . . . . . . . . . . 110 . . . . . 121 Seljenje projekta s ra£unala na ra£unalo 9. . . . . . . .2 Tipi£an problem prilikom selidbe Savjeti za uspje²nu selidbu . . . . . . . . . . . . . . . . 119 Automatizacija rada na kodu Povijest datoteke . . . . . 113 . . . . 120 . . .2 8. . .3 Eclipse -u 119 . . . Adapter . 121 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 9. . . . . . .4 109 Template method Observer . . .1 9. . . . . . . 109 . . . . Decorator . . . . . . . .3 8. . . . . . . . . . . . . . . . . . . . .iv SADRšAJ 8 Uzorci u dizajnu koda 8. . . . . . . 115 9 Savjeti za rad u 9. . . . . . .3. . . . . . . . . . . .3. .

. . . . . . . . . Eksplicitna pretvorba vrste cjelobrojnih podataka . . . . . . . . . 1. . . . . .24 Dodatak metode za kopiranje u su£elje 1. . . .7 1. . .23 Pro²irenje apstraktne klase . . . . . . . . . . .Popis ispisa ƒimplegounter wodulogounter 1. . . .1 1. . Analiza vi²edijelnog dokumenta 1. . gounter . . . Analizator teksta . . . . . . . . 1. 2. . 1. Izvr²na klasa . . . . . . . .4 1. . . . . . . . . . . . . 1. . . . . . . . . . . . . . . . .11 Polimorfni analizator teksta 1. . . . . .5 1. . . . . . . . . . . . . . . 1. . . . . . . . . .19 Konkretne klase izvedene iz apstraktne 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26 Analizator teksta koji koristi kompoziciju . . . . . . Program koji koristi dvije instance iste klase . . . . . . . . . . . . . . . . . v .17 Naslježivanje  izvedena klasa . . . . . . . . . . . . . . . . . . . . . .3 1. . . . .22 Pro²ireno su£elje gounter . . . . . . .2 Implicitna pretvorba vrste cjelobrojnih podataka . . .21 Nove konkretne klase . . . . . . . .1 2. . . . .10 Nadomjesna implementacija klase 1. .20 Nova verzija apstraktne klase . . . . . . . . . . . . . .9 Klasa Klasa . . . . . . . . . . . . . . . . . . . . . . . . . .2 1.13 Polimorzam na djelu 1. . . . . . . 1. . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Su£elje „extpile . . . . s druga£ijom metodom 3 4 5 7 8 9 10 11 12 12 13 14 14 16 17 18 19 21 22 27 27 29 29 30 30 31 39 40 in™rement . .15 Obvezivanje na implementaciju su£elja 1. . ƒimplegounter s dodanom podr²kom za kopiranje 1. . . . . . 1. . . . .25 Klasa gounter . . . . . . . . . . . . . . . . 1. . . . . . .14 Jo² jedan primjer kori²tenja polimorzma .16 Naslježivanje  osnovna klasa . . . . . . . . . . . . . . . . . . . . . . Klasa hifferenti—lgounter . 1. . .8 1. . . . . . . . . . . . . .18 Apstraktna klasa . . . . . . . . .6 1. . . . . . . . . . . . . . . . . Pro²irena varijanta klase ƒimplegounter Kori²tenje konstruktora . . . . . . . . . . . . . . . . . . . . . . . . .

. . .4 4. . . . . 3. . . . . . . . .3 2. . . . . . . . . . . .4 5. . Izjave ˜re—k i ™ontinue koje koriste oznake . . .3 3. . . . . . . . . . . . .4 3. . . . . . . . . . .10 Poziv stati£ke metode . . 2. . . . . . . . . . . . . . . . . . Bacanje i ponovno bacanje iznimke Izvje²taj o ba£enoj iznimci . . . . . . . . . . . . za usporedbu Posljedice pogre²nog kori²tenja aa ƒtring-ova . . . . . . fin—lly . . . . . . . . . . . . . Lista i skup . . . . . . .3 4. . . Prolaz po kolekciji eksplicitnim kori²tenjem iteratora Kori²tenje iteratora za mijenjanje liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 Neuspio poku²aj kori²tenja metode s eksplicitnim this this . . . . . . . . . .8 2. . .4 2. . . . . . . . . . . . . 2. . . .12 Stati£ki atribut. . . . . . . .5 2. . . . . . . . . .13 wodulogounter s dodatnom metodom setwodulus .1 5. . . . . 40 41 41 42 43 44 46 47 48 48 50 51 52 52 53 54 56 57 62 63 65 66 67 73 75 75 76 78 79 81 84 87 88 90 91 92 92 swit™h . . . . .6 Implementacija metode equ—ls . . . . . . . . . . . . . . . . . . .20 Poziv konstruktora iste klase . Osnovno kori²tenje enumeracije Kori²tenje enumeracije u bloku . . . . . .11 Poziv stati£ke metode sintaksom kao da je instancina metoda 2. . .vi POPIS ISPISA 2.3 5. . . . . . . . . .7 4.2 3. . . . . . . Oboga¢ena enumeracija . . . . . . . . . . . . . . . . .9 Jednostavna enumeracija . . . . . . . . . . . . . 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 4. . . . .6 2. . Tipi£na pogre²ka s preoptere¢enjem umjesto nadja£avanjem Predloºak za generiranje he²-koda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. . . . . . Hvatanje iznimke Blok . . .8 5.1 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 3. . . . . . . . . . . . . . . . . . .16 Implicitni parametar . 2. . . . . . . . . . . wodulogounter s provjerom parametra . . . . . . . . . . . . . . . . . . . . . 2. . . .17 Neuspio poku²aj uvoženja eksplicitnog parametra 2. . . . .5 5. . . . . . . . . . . . . . . . . . . . . . Kratki primjeri uporabe upravlja£kih konstrukcija . . . . . Implementacija metode toƒtring . usegounter this . . .5 4. . . . . . Kolekcija i primitivne vrste podataka . . . . . . .19 Eksplicitan poziv konstruktora natklase . . javna konstanta . . . . .6 4. . . . . . . .15 Doražena metoda wodulogounter-om . . .7 2. . . . . . 2. . . . . .2 5. . . . . . .14 Metoda koja upravlja 2. . 2. Model klasne enkapsulacije . . . . . .5 4. . Prolaz po kolekciji petljom enhanced for . . . Vi²estruki blokovi Najava iznimke ™—t™h . . . . . . . . . . . Deniranje vlastite iznimke Osnovno baratanje kolekcijom .

. . . . . . . 112 Pokazna izvedba adaptera na znakovni tok . 101 Rad s izlaznim tokom . . . . . . . . 104 Pisa£ i £ita£ . . . . . . . . . . . . . . .7 5. . . . . . . . . . . . . . . 111 . . . . . 116 . . . .POPIS ISPISA vii 5. . .8 8. . . . . . . . . . . . . . . . . . .4 6. 105 Su£elje oslu²kiva£a dolaznih paketa . . . . . . . . . . . . . 113 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 7. . . . . . . . . . . . . . . . 93 95 95 99 99 Metoda ™omp—re„o Komparator za studente koji name¢e poredak po ID-ju Rad s jednodimenzionalim poljem . .3 7. . . 100 . . . . 101 Pretvorbe izmežu polja i liste . . . . . 111 Jednostavna implementacija oslu²kiva£a dolaznih paketa Komunikacijski £vor s podr²kom za oslu²kiva£e . .1 6. . . . . . . .2 7. . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Prolaz po polju kori²tenjem eksplicitnog indeksa . . . . . . . . . . . . .9 Klasa ƒtudent koja demonstrira mapu . 103 Rad s ulaznim tokom . . . . .8 5. .7 8. . 111 Kori²tenje sustava . .2 6. .9 6. . . .5 6. . . . . 105 Omota£i podatkovnih tokova . . .3 6. . . . . . . Rad s dvodimenzionalnim poljem . . . . . . . . . . . . . . . . .10 Primjer primjene uzorka Decorator . . . . . . . . . . . . .5 8. . . . . . . Prolaz po svim £lanovima polja petljom Trokutasto dvodimenzionalno polje enhanced for . . . . . . . .1 7. .4 8. . . . . .6 8. . . .

.

1 Detaljnija argumentacija ovoga krije se iza fraze shu-ha-ri (usvajanje pravilakr²enje pravila-napu²tanje pravila) o kojoj se moºe informirati na Webu. Sva takva rje²enja treba usvojiti umjesto otkrivati toplu vodu vlastitim pristupima. Na ovaj predmet uglavnom se dolazi s tek minimalnim predznanjem programiranja u imperativnoj paradigmi i bez razvijenih vje²tina u dizajnu programskog sustava. To minimalno predznanje naºalost £ak predstavlja i smetnju u savladavanju Jave i objektno-orijentiranog pristupa jer daje laºan dojam poznatosti jezi£nim konstrukcijama koje ustvari imaju druga£ije zna£enje i. ali to jo² uvijek nije dovoljno za uspje²no rje²avanje zadataka. tendencija stu- denata je da se za rje²avanje nekih od problema oslanjaju na ve¢ poznate tehnike iz jezika C i imaju velik otpor pri usvajanju tehnika uobi£ajenih za Javu. Iz istog razloga za²to nitko jo² nije nau£io npr. njegovog dijela posve¢enog jeziku Java) je ne samo uputiti studente u sintaksu jezika Java. U£enje programskog jezika u mnogo£emu podsje¢a na u£enje prirodnog jezika. objektne paradigme student kao prvo treba dobro razumjeti osnovna svojstva i mogu¢nosti objekta. ²to je jo² vaºnije. Pri savladavanju nove. ve¢ prije svega podu£iti tehnike objektno-orijentiranog programiranja i dizajna sustava objekata. nitko nije i ne¢e nau£iti Javu isklju£ivo £itaju¢i ovu skriptu i slu²aju¢i predavanja. Jednako je bitno razviti vje²tinu organiziranja £itavog sustava objekata koji predstavlja rje²enje zadanog problema. Za mnoge elementarne probleme postoje standardna rje²enja koja je razvijateljska zajednica prihvatila kao najbolja. ™PF™omG™giGwikic„hreevevelsyfeudien™e ix . 1 Takožer. druga£iju ulogu u jeziku.Predgovor Svrha ovog kolegija (to£nije. engleski jezik isklju£ivo £itaju¢i gramatiku i rje£nik. Neizostavna aktivnost jest trenpr. Po£etnik treba biti svjestan da jo² nije do²ao u poziciju da ima puni pregled nad razlozima za²to je neko rje²enje bolje od drugog.

to je intelektualno zahtjevan i kreativan proces sa svojom vlastitom estetikom.x Predgovor ning. ali tek vrlo malo onih koji su te vje²tine usvojili samostalno tijekom semestra. iako biste moºda £ak i znali odgovor. kreativnog i ruºnog. ovaj atribut ne bi trebao biti stati£ki jer mu je vrijednost razli£ita za svaku instancu. . ºelim se izjasniti i po pitanju jedne vrlo pro²irene predrasude: pisanje dobrog koda nije nikakvo mehanizirano ²trikanje. nabacanog koda. rujna 2005. nije ispravno preuzeti zadatak i rje²avati ga u izolaciji: kriterij uspjeha nije krajnji proizvod sadrºan u datotekama Fj—v—. Zadatak je tek sredstvo. Marko Topolnik Zagreb. nego vje²tina koju ste stekli. studenti koji bez interakcije s asistentom na kraju semestra dolaze s rje²enjem zadatka dijele se u dvije skupine: oni £iji kod je niske kvalitete i jasno je da nisu ni²ta nau£ili i oni £iji kod je kvalitetan jer se nadaju da asistent ne¢e shvatiti da taj kod nije njihovo djelo. pratiti podizanje te razine tijekom semestra. Ako asistent kaºe npr. to je najvjerojatnije stoga ²to nije jo² razvio estetske kriterije da bi uvidio razliku izmežu lijepog. prilikom ispitivanja dogodit ¢e vam se da ne razumijete postavljeno pitanje. a to u ovom kontekstu zna£i vlastoru£no pisanje koda iz nule. Ta £injenica predstavlja zna£ajnu prepreku: u£enik prvo treba skupiti motivaciju da umo£i noge da bi uop¢e do²ao u poziciju da cijeni vlastiti rad. prou£ava va²a rje²enja i konstantno vas korigira i usmjerava. onaj tko nije ni pro£itao skriptu ne¢e imati koristi od takvog savjeta jer ga naprosto ne¢e razumjeti. ponajprije. morate ve¢ razumjeti odreženi skup pojmova i stru£nih izraza. Jednako tako. primjer na kojem se moºe najbolje utvrditi razina va²e vje²tine i. Ako netko smatra druga£ije. ova skripta ima vaºnu ulogu u £itavom procesu u£enja: da biste uop¢e mogli komunicirati s nekim poznavateljem Jave. U drugoj skupini ima dodu²e i ne²to onih koji zaista posjeduju potrebne vje²tine. a tko ne cijeni ono ²to radi ne moºe ni imati dobro mi²ljenje o svojoj struci.sc. uz stalni nadzor asistenta koji zadaje zadatke. Iako nije dovoljna sama za sebe. dr. 1. Dakle. U praksi. Na kraju.

Ovaj moment je kriti£an jer se va²a ocjena prvenstveno formira upravo tijekom te komunikacije.0 ).Uvod Nastava na kolegiju Seminar Java+XML sastoji se iz dva dijela: predavanja i laboratorijske vjeºbe. Kriterij za ocjenu nije ispravan rad aplikacije koju ste razvili. 1 . Neka od izostavljenih podru£ja: • ugnjeºžene klase nose zna£ajan dio ukupne kompleksnosti jezika i intenzivno se koriste u programiranju GUI-ja. s time da je teºi²te na vjeºbama. ve¢ razina vje²tine programiranja koju ste stekli. Organizacija samih vjeºbi na kolegiju je speci£na. Izradi projekta prethode manji zadaci na kojima ¢ete savladati najosnovnije tehnike rada s razvojnim alatom i pisanja samog koda. • reeksija sluºi za zaobilaºenje ograni£enja Javinog stati£kog odreživanja vrste izraza. a na kraju semestra bit ¢e posebno ispitivani samo oni studenti koji iz bilo kojeg razloga nisu suraživali s asistentom tijekom semestra. Rje²enja zadataka ocjenjuju se neovisno o projektu. Skripta se odnosi na Javinu verziju 5 ( Java 2 Platform Standard Edi- tion 5. U skripti je obražen samo osnovni podskup jezika Java. Bit ¢e pokriven u predmetu Konkurentno programiranje. tako da se studentima preporu£a da unaprijed pro£itaju poglavlje £ija ¢e se materija izlagati na sljede¢em predavanju. • model vi²enitnosti omogu¢uje kori²tenje vi²e izvr²nih niti (dretvi) i sinkroniziran pristup zajedni£kim resursima. Glavnina termina (oko pet-²est) posve¢ena je izradi malog softverskog projekta. Termine vjeºbi treba prije svega koristiti za komunikaciju s asistentom koji ¢e nadzirati va² napredak na projektu. Sadrºaj ove skripte bit ¢e izlagan na predavanjima.

Tekst daljnjih poglavlja nije toliko usko povezan pa £itanje po redu nije tako bitno. Studentu se preporu£a da prvo poglavlje pro£ita u cijelosti jer se tamo spominje velik broj najvaºnijih pojmova. . a tekst je pisan kao jedna pri£a u kojoj se pojmovi uvode gdje koji zatreba. Gotovo sve ovdje re£eno predstavlja drasti£no pojednostavljenje u odnosu na preciznu i potpunu istinu.2 Uvod Takožer je iznimno vaºno imati na umu da je i materija koja se obražuje u skripti obražena samo sa svrhom uvoda u Javu za po£etnika  nikako se ne smije shvatiti kao potpuna informacija. sve u svrhu lak²e razumljivosti po£etniku. Ako je £itatelj ve¢ poznavatelj Jave i takva ga pojednostavljenja smetaju. neka slobodno odloºi skriptu jer njemu ona i ne treba.

Objekti su mežusobno povezani (znaju jedan za drugog) i mežusobno komuniciraju razmjenom poruka.1: Klasa ƒimplegounter pu˜li™ ™l—ss ƒimplegounter 3 . identi£an poziv metode u razli£itim trenucima moºe vratiti razli£itu vrijednost. O stanju ovisi kako ¢e objekt odgovarati na budu¢e pozive metoda. ovisno o stanju u kojem je objekt zate£en. enkapsulacija U objektno-orijentiranom programskom jeziku izrada programa moºe se u sustava objekata.1 Objektna paradigma. U praksi to se svodi na popis metoda koje ¢e on posjedovati. Za svaki objekt najvaºnije je utvrditi ²to ¢e se od njega o£ekivati da radi. Takožer je bitno na koji na£in poziv metode utje£e na stanje objekta. na engleskom se u kontekstu Jave £esto koristi i izraz eld ). a izvana trebaju biti vidljive samo one posljedice tog stanja koje su zaista potrebne  dakle utjecaj stanja na povratne vrijednosti metoda.Poglavlje 1 Osnovni elementi jezika Java 1. ²to se svodi na to da jedan objekt poziva metode drugoga. Osnovno na£elo dizajna objekata  enkapsulacija ili zatvaranje  nalaºe da stanje objekta mora ostati skriveno. Stanje objekta u praksi se svodi na vrijednosti njegovih atributa (unutarnjih varijabli. Dakle. njegovo pona²anje. ƒesto je mogu¢e posti¢i da programski objekti modeliraju stvarne objekte. Evo jednostavnog primjera opisa objekta u Javi: Ispis 1. tj. Za svaku metodu najbitnije je koje argumente prima i kakvu vrijednost vra¢a. Dakle. pri kretaosnovi svesti na izgradnju nju u rje²avanje zadanog problema prvo treba osmisliti koji objekti ¢e biti potrebni i kako ¢e biti povezani.

Stanje je pohranjeno u atributu To je obi£an cijeli broj (vrste ™ounterƒt—te. UML-ov dijagram klase ƒimplegounter prikazan je na slici 1. Dakle. in™rement U protivnom bi ih objektu iza leža mogli mijenjati drugi objekti. £ija metoda ustvari izgleda ovako: Ispis 1.1. od kojih jedna mijenja njegovo stanje (in™rement). enkapsulacije. Recimo da imamo malo druga£iju klasu. wodulogounter. a druga to stanje dojavljuje vanjskom svijetu (getƒt—te). rezultat metode getƒt—te je ovi- san o trenutnom stanju objekta.1: UML-ov dijagram klase ƒimplegounter £ime se ostvaruje na£elo Vaºno je da svi atributi imaju oznaku skrivenosti stanja odnosno priv—te.2: Klasa wodulogounter s druga£ijom metodom in™rement pu˜li™ ™l—ss wodulogounter { pu˜li™ void in™rement@A { if @ thisF™ounterƒt—te aa W A thisF™ounterƒt—te a HY else thisF™ounterƒt—teCCY } .4 POGLAVLJE 1. Pri kreiranju objekta svi brojevni atributi se implicitno inicijaliziraju na vrijednost nula. int. OSNOVNI ELEMENTI JEZIKA JAVA { priv—te int ™ounterƒt—teY pu˜li™ void in™rement@A { thisF™ounterƒt—teCCY } pu˜li™ int getƒt—te@A { return thisF™ounterƒt—teY } } Na² objekt opisan klasom ƒimplegounter raspolaºe dvjema metodama. SimpleCounter -counterState : int +increment() +getState() : int Slika 1. poznat iz jezika C).

Time bi se naru²ila funkcionalnost objekta jer bi se. OSNOVNI ELEMENTI JEZIKA JAVA 5 } FFF —tri˜ut ™ounterƒt—te i metod— getƒt—te isti k—o u ƒimplegounter FFF dakle.POGLAVLJE 1. Takožer daje programeru ve¢u slobodu u eventualnom redizajniranju objekta. kao drugo. iako ju sam jezik Java ne name¢e. mogao bi se izvana promijeniti na proizvoljnu vrijednost. Izraz ira novi objekt klase new ƒimplegounter@A kre- ƒimplegounter. Enkapsulacija. Metoda prima parametar  polje znakovnih nizova. Imena i podatkovne vrste (tipovi) atributa mogu se proizvoljno mijenjati dok god se zadrºava isto pona²anje objekta kakvo se o£ituje u vrijednostima koje vra¢aju me- tode. uglavnom je neizostavan dio dizajna objekta jer spre£ava velik broj programerskih pogre²aka uz naj£e²¢e malu ili nikakvu ºrtvu u eleganciji koda. kao prvo. broja£ na²ao u nedozvoljenom stanju i. da broja£ cirkularno broji samo do devet i onda se vra¢a na nulu.3: Izvr²na klasa pu˜li™ ™l—ss epp„h—t…ses„hegounter { pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒimplegounter ™ntr a new ƒimplegounter@AY ƒystemFoutFprintln@ 4€o£etno st—nje ˜roj—£—X 4 C ™ntrFgetƒt—te@A AY ™ntrFin™rement@AY ƒystemFoutFprintln@ 4ƒt—nje n—kon poziv— metode in™rementX 4 C ™ntrFgetƒt—te@A AY } } Prikazana metoda m—in stvara jedan objekt. Referenca na taj objekt zapisuje se u . Ona ¢e biti implicitno pozvana kad izvr- ²imo klasu. U njemu su pobrojani argumenti zadani u naredbenom retku prilikom pokretanja programa. koristi ga i o rezultatima izvje²¢uje korisnika ispisom teksta na zaslon. Ispis 1. pokrenemo svoj program. daljnji pozivi metode in™rement nastavili bi brojati prema beskona£nosti. tj. 10. npr. 1.2 Pokretanje programa pisanih u Javi izvr²nu klasu U jeziku Java program se pokre¢e tako da se prvo denira koja sadrºi posebnu metodu m—in. Kad atribut ™ounterƒt—te ne bi bio privatan.

Dakle. OSNOVNI ELEMENTI JEZIKA JAVA lokalnu varijablu ™ntr i nakon toga se preko te varijable mogu pozivati metode objekta. To je izvr²ni kod za tzv. Java Virtual Machine odnosno JVM)  posebnu hardversku platformu koja postoji samo na papiru.10).1 Rad u naredbenom retku Fj—v—. JVM. Next Create separate source and output folders.6 POGLAVLJE 1. Upisati ime projekta. i proslijediti mu ime na²e izvr²ne klase: 6 j—v— epp„h—t…ses„hegounter Vaºno! Kao argument ove naredbe ne navodi se ime klasne datoteke. New.1): Kako pokrenuti ovaj primjer u 1. ekspandirati ga. To ¢e pogotovo biti vaºno kasnije. File.. tj. Javin virtualni stroj (eng.2. Project. uvjeriti se da je uklju£eno  3. Ispis koji generira program bi trebao biti sljede¢i: €o£etno st—nje ˜roj—£—X H ƒt—nje n—kon poziv— metode in™rementX I 1. bytecode. class le ) koja sadrºi binarnu deniciju klase u posebnom Javinom mežukodu (eng.2. na¢i projekt.. a svaka realna hardverska platforma ju emulira. Rezultat je klasna datoteka (eng.13). kad uvedemo (odjeljak 1. Ime datoteke mora biti identi£no imenu klase + suks (kompajlira) Javinim alatom j—v—™ ( Java compiler ): 6 j—v—™ epp„h—t…ses„hegounterFj—v— nije izvr²na datoteka koju se moºe izravno pokrenuti. Finish 2. pakete 1.2 Rad u okruºju Eclipse Eclipse -u (vrijedi za verziju 3. Java Project. Datoteku se prevodi Nekim editorom teksta treba stvoriti datoteku s izvornim kodom. U okviru oznaku Package Explorer na direktorij src. u naRezultat ovog koraka redbenom retku treba pokrenuti emulator. vidjeti odjeljak 2. ve¢ samo ime klase. namjestiti .

6. Java Application. 7. Sve instance iste klase m—in imaju isti popis atributa. dok je kurzor u editoru doti£ne klase. ali naravno svaka ima svoje vlastite vrijednosti tih atributa. U editorskom okviru otvara se stvorena datoteka i u njoj ve¢ pi²e prvi redak koda. U okviru Ili. J. Run As. moºe ga se otvoriti pomo¢u Win- dow. Console vidi se ispis programa. Pokretanje klase: desni klik na izvr²nu klasu u Package Explorer-u. ve¢ samo sadrºi metodu m—in koja je poseban slu£aj i nije normalna metoda objekta.7).4: Program koji koristi dvije instance iste klase pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒimplegounter ™ntrI a new ƒimplegounter@AY ƒimplegounter ™ntrP a new ƒimplegounter@AY ƒystemFoutFprintln@ 4€o£etn— st—nj— ˜roj—£—X 4 C ™ntrIFgetƒt—te@A C 4D 4 C ™ntrPFgetƒt—te@A AY ™ntrIFin™rement@AY ƒystemFoutFprintln@ 4ƒt—nj— n—kon poziv— metode in™rement n—d ™ntrIX 4 C ™ntrIFgetƒt—te@A C 4D 4 C ™ntrPFgetƒt—te@A AY } O£ekivani ispis: €o£etn— st—nj— ˜roj—£—X HD H ƒt—nj— n—kon poziv— metode in™rement n—d ™ntrIX ID H Klasa epp„h—t…ses„hegounter s ispisa 1. O tome ¢e se vi²e raspravljati kasnije (u odjeljku 2. Class. Moºemo ju smatrati U ovom trenutku moºe se usvojiti i osnovna ideja predlo²kom za objekte koji prvenstveno propisuje koje atribute ¢e objekt imati za £uvanje stanja i sadrºi denicije metoda koje ¢e se nad njim mo¢i pozivati. OSNOVNI ELEMENTI JEZIKA JAVA 7 4. upotrijebiti kombinaciju tipaka Alt-Shift-X.POGLAVLJE 1. Upisati ime klase. File. New. .3 je druga£ija: ona ne opisuje nikakav smisleni objekt. Ako bilo koji od okvira nije vidljiv. Objekt se jo² naziva i instancom svoje klase.3 Pojam klase klase. Show view 1. Upisati ostatak 5. koda. To se moºe ilustrirati ako izmijenimo tekst gornje metode na sljede¢i: Ispis 1.

2 i 1. izgradnja objektnog sustava Dva objekta moºe se povezati tako da jedan objekt sadrºi atribut koji pokazuje na drugi objekt.3.8 POGLAVLJE 1.4 Povezivanje objekata. Ispis 1.2: Objektni dijagram minimalnog objektnog sustava . OSNOVNI ELEMENTI JEZIKA JAVA 1. cntr1 diffCounter1 cntr2 Slika 1.5: Klasa hifferenti—lgounter pu˜li™ ™l—ss hifferenti—lgounter { priv—te ƒimplegounter ™ntrI a new ƒimplegounter@AY priv—te ƒimplegounter ™ntrP a new ƒimplegounter@AY pu˜li™ void in™rementI@A { thisF™ntrIFin™rement@AY } pu˜li™ void in™rementP@A { thisF™ntrPFin™rement@AY } pu˜li™ int gethifferen™e@A { return thisF™ntrPFgetƒt—te@A E thisF™ntrIFgetƒt—te@AY } pu˜li™ void reset@A { thisF™ntrI a new ƒimplegounter@AY thisF™ntrP a new ƒimplegounter@AY } } UML-ovi klasni i objektni dijagram za ovaj slu£aj prikazani su na slikama 1. npr.

metoda reset takožer ih (re)inicijalizira. £ime postiºemo da se objekt inicijalizira u onakvo stanje kakvo je potrebno u danom trenutku. Klju£na karakteristika ovog odnosa je da podreženi objekti postoje isklju£ivo kao sastavni dio nadreženog i njihovo postojanje je uvjetovano tim objektom.3: Klasni dijagram minimalnog objektnog sustava Objekt klase hifferenti—lgounter povezan je s dva objekta klase ƒimpleE gounter i komunicira s njima.POGLAVLJE 1. Na primjer. a ako ih ima vi²e. Tipi£an na£in inicijalizacije atributa je unutar konstruktora. Asocijativni odnos izmežu hifferenti—lgounter i ƒimplegounter naziva se kompozicijom. 1.5 Inicijalizacija objekta konstruktorom new kojom zatraºimo kreiranje Svaki put kad upotrijebimo klju£nu rije£ nove instance zadane klase. U to se moºemo uvjeriti ako uvidimo da je hifferenti—lgounter taj koji stvara podrežene objekte i da nijedan vanjski objekt ne moºe do¢i do reference na njih (zapisane su u privatnim atributima. Svaka klasa ima bar jedan konstruktor. OSNOVNI ELEMENTI JEZIKA JAVA 9 DifferentialCounter +increment1() +increment2() +getState() : int -cntr1. objekt ¢e stupiti u kontakt sa svakim od broja£a i zatraºiti njihovo trenutno stanje. implicitno smo zatraºili i pozivanje posebne inicijalizacijske procedure opisane konstruktorom objekta. Na primjer. kad se pozove metoda gethifferen™e. uklonjeni iz radne memorije postupkom zvanim o kojem ¢e se pri£ati u sljede¢em odjeljku. Pomo¢u parametara moºemo prenijeti dodatnu informaciju inicijalizacijskom postupku. Time je izgražen minimalan sustav objekata. sakupljanje sme¢a). Primjerice. nijedna javna metoda ih ne vra¢a). Prikazani slu£aj u kojem se atributi ™ntrI i ™ntrP inicijaliziraju na mjestu gdje su i deklarirani samo je jedan od na£ina inicijalizacije atributa. cntr2 1 2 SimpleCounter -counterState : int +increment() +getState() : int Slika 1. oni se razlikuju po broju i vrstama parametara. moºemo pro²iriti na²u klasu ƒimplegounter: . stvaraju¢i nove objekte ƒimplegounter (time se stari objekti implicitno odbacuju i bit ¢e automatski garbage collection.

£im deklariramo bilo koji konstruktor eksplicitno. OSNOVNI ELEMENTI JEZIKA JAVA Ispis 1. ni²ta se ne dodaje implicitno. Dakle. iako bi se to moglo zaklju£iti sude¢i po njegovom imenu. prazan podrazumijevani konstruktor. iako nije bio deklariran nijedan. Mežutim.1). klasi je implicitno dodan upravo ovakav. U ranijem slu£aju (ispis 1.6: Pro²irena varijanta klase ƒimplegounter pu˜li™ ™l—ss ƒimplegounter { priv—te int ™ounterƒt—teY pu˜li™ ƒimplegounter@ int initi—lƒt—te A { thisF™ounterƒt—te a initi—lƒt—teY } pu˜li™ ƒimplegounter@A { GGne r—di ni²t— dod—tnoY ™ounterƒt—te se —utom—tski GGini™ij—lizir— n— nulu } } FFF dekl—r—™ije metod— in™rement i getƒt—te k—o r—nije FFF U kodu 1.10 POGLAVLJE 1.6 denirana su dva konstruktora: prvi prima jedan cijeli broj  po£etnu vrijednost broja£a. Drugi je takozvani podrazumijevani konstruk- tor  onaj koji ne prima nijedan parametar. O£ekivani ispis: €o£etno st—nje ˜roj—£—X HD Q ƒt—nje n—kon poziv— metode in™rement n—d ™ntrIX ID Q . Primjer poziva konstruktora: Ispis 1. a ™ntrI se inicijalizira podrazumijevanim konstrukto- ™ntrP konstruktorom koji putem parametra zaprima ºeljeno po£etno stanje.7: Kori²tenje konstruktora pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒimplegounter ™ntrI a new ƒimplegounter@AY ƒimplegounter ™ntrP a new ƒimplegounter@ Q AY ƒystemFoutFprintln@ 4€o£etn— st—nj— ˜roj—£—X 4 C ™ntrIFgetƒt—te@A C 4D 4 C ™ntrPFgetƒt—te@A AY ™ntrIFin™rement@AY ƒystemFoutFprintln@ 4ƒt—nj— n—kon poziv— metode in™rement n—d ™ntrIX 4 C ™ntrIFgetƒt—te@A C 4D 4 C ™ntrPFgetƒt—te@A AY } U ovom primjeru rom. klasa ne mora imati podrazumijevani konstruktor.

Za £uvanje rezultata brojanja koristi se objekt vrste ƒimplegounter.6 Povezivanje objekata agregacijom Uzmimo da imamo objekt koji sluºi za jednostavnu analizu tekstualne datoteke  ustanovljuje koliko redaka teksta sadrºi. npr. tako da oni nisu njegovi privatni. Datoteku predstavlja objekt vrste „extpile. Ovdje to moºe biti sasvim korisno: recimo da imamo jedan ve¢i dokument razbijen u vi²e datoteka. jedna datoteka . Objekt-analizator teksta je instanca klase Ispis 1. Moºemo u zapisu konstruktora vidjeti da se reference na te objekte izravno prepisuju u atribute Klasa ™ntr odnosno file. OSNOVNI ELEMENTI JEZIKA JAVA 11 1. koju smo sreli ranije. Nad njim moºemo pozvati metodu re—dvine koja £ita jedan redak datoteke i metodu end‚e—™hed koja nas izvje²tava ima li jo² redaka za pro£itati.8: Analizator teksta „exten—lyzer: pu˜li™ ™l—ss „exten—lyzer { priv—te ƒimplegounter ™ntrY priv—te „extpile fileY priv—te ˜oole—n ™ounthoneY pu˜li™ „exten—lyzer@ ƒimplegounter ™ntrD „extpile file A { thisF™ntr a ™ntrY thisFfile a fileY } pu˜li™ int ™ountvines@A { if @ 3thisF™ounthone A { while @ 3fileFend‚e—™hed@A A { fileFre—dvine@AY thisF™ntrFin™rement@AY } thisF™ounthone a trueY } return ™ntrFgetƒt—te@AY } } Najvaºnije je uo£iti da konstruktor klase prima kao parametre instance klasa ƒimplegounter „exten—lyzer i „extpile. i stoga ima asocijativnu vezu prema ƒimplegounter-u „extpile-u.POGLAVLJE 1. To se vidi po tome ²to „exten—lyzer prima izvana stvorene objekte. ali ovdje se ne radi o kompoziciji.

OSNOVNI ELEMENTI JEZIKA JAVA za svako poglavlje. Dakle. Objekt analizatora. UML-om se agregacija prikazuje kao na slici 1. To moºemo posti¢i kori²tenjem na²eg analizatora teksta ovako (primjer pretpostavlja da imamo dokument razbijen u dvije datoteke): Ispis 1. bez obzira na to pripadaju li dijelovi isklju£ivo toj cjelini ili ne.9: Analiza vi²edijelnog dokumenta pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { „extpile fileI a new „extpile@ IS AY GG d—totek— od IS red—k— „extpile fileP a new „extpile@ PS AY GG d—totek— od PS red—k— ƒimplegounter ™ntr a new ƒimplegounter@AY „exten—lyzer t—I a new „exten—lyzer@ ™ntrD fileI AY ƒystemFoutFprintln@ 4froj red—k— u prvoj d—tote™iX 4 C t—IF™ountvines@A AY GG snst—n™ir—mo —n—liz—tor druge d—totekeD —li s istim ˜roj—£emX „exten—lyzer t—P a new „exten—lyzer@ ™ntrD fileP AY ƒystemFoutFprintln@ 4…kup—n ˜roj red—k—X 4 C t—PF™ountvines@A AY } O£ekivani ispis: froj red—k— u prvoj d—tote™iX IS …kup—n ˜roj red—k—X RH Iz primjera je jasno da je ºivotni vijek objekta broja£a neovisan o objektu analizatora.12 POGLAVLJE 1. svaka kompozicija je ujedno i agregacija. ali obrat ne vrijedi.4: UML-ov dijagram klasa u odnosu agregacije U kodu klase „exten—lyzer koristi se objekt vrste „extpile. nakon ²to je obavio svoj posao. ali je njena denicija stroºa. Uo£imo da kompozicija takožer zadovoljava ovu deniciju. Umjesto pu- nog objekta koji radi s pravim datotekama radi isprobavanja koristimo ovaj jednostavan nadomjestak: . Ono ²to nas zanima je ukupan broj redaka u £itavom dokumentu.4. TextFile +countLines() : int 1 -file 1 TextAnalyzer +countLines() : int 1 -cntr 1 SimpleCounter +increment() +getState() : int Slika 1. Za takav slu£aj koristi se izraz agregacija  to je op¢enito odnos izmežu cjeline i nje- nih sastavnih dijelova. moºe se ukloniti iz memorije a da to ne utje£e na objekt broja£a.

kao u ispisu 1. Treba uvesti samo sitnu izmjenu u kod s ispisa 1. Ovo je korisno iz mnogo razloga. atributi potrebni za £uvanje stanja).8: Ispis 1.2).POGLAVLJE 1. moºemo dobiti ili ukupan broj redaka ili samo njegovu posljednju znamenku (brojanje modulo 10.11: Polimorfni analizator teksta pu˜li™ ™l—ss „exten—lyzer { priv—te gounter ™ntrY priv—te „extpile fileY priv—te ˜oole—n ™ounthoneY pu˜li™ „exten—lyzer@ gounter ™ntrD „extpile file A { thisF™ntr a ™ntrY . a ovdje ¢emo opisati jedan od njih. šelimo da. ovisno o konkretnoj primjeni.7 Polimorzam i Javino su£elje su£elje objekta implementaciju prema okolini (dakle tog su£elja (sam kod U Javi moºemo razdvojeno opisati popis metoda s kojima raspolaºe) i metoda. OSNOVNI ELEMENTI JEZIKA JAVA 13 Ispis 1. Posebno je bitno da za jednu deniciju su£elja moºemo imati mnogo razli£itih implementacija. Recimo da imamo gornji slu£aj analizatora teksta.10: Nadomjesna implementacija klase „extpile pu˜li™ ™l—ss „extpile { priv—te int lines„ot—lY priv—te int lines‚e—dY pu˜li™ „extpile@ int linegount A { thisFlines„ot—l a linegountY } pu˜li™ void re—dvine@A { if @ thisFlines‚e—d ` thisFlines„ot—l A thisFlines‚e—dCCY } pu˜li™ ˜oole—n end‚e—™hed@A { return thisFlines‚e—d aa thisFlines„ot—lY } } 1.

14

POGLAVLJE 1.

OSNOVNI ELEMENTI JEZIKA JAVA

}

thisFfile a fileY

}

pu˜li™ int ™ountvines@A { if @ 3thisF™ounthone A { while @ 3fileFend‚e—™hed@A A { fileFre—dvine@AY thisF™ntrFin™rement@AY } thisF™ounthone a trueY } return ™ntrFgetƒt—te@AY }

Ovaj kod je identi£an kao ranije, osim ²to se umjesto koristi vrsta

ƒimplegounter

gounter,

£iju deniciju jo² nismo vidjeli. Radi se o Javinom

su£elju :
Ispis 1.12: Su£elje

gounter

pu˜li™ interf—™e gounter { void in™rement@AY int getƒt—te@AY }

denicije metoda, ve¢ samo popis metoda koje objekt s tim su£eljem posjeduje, tj. deklaracije metoda. Konstruktor klase „exten—lyzer prihvatit ¢e bilo koji objekt koji implementira
U su£elju, kao ²to smo najavili, nema to su£elje, a metodi

™ountvines

bit ¢e svejedno o kakvoj se to£no imple-

mentaciji radi. Mežutim, razli£ite implementacije rezultirat ¢e razli£itim pona²anjem metode. Ova karakteristika objektno-orijentiranih jezika zove se

polimorzam

ili

vi²eobli£nost. Metoda misli

da uvijek radi s objektom

iste vrste (gounter), koji se iz te perspektive doima kao da se mijenja od slu£aja do slu£aja  jednom se moºe pona²ati kao put kao

ƒimplegounter,

a drugi

wodulogounter. pu˜li™

Uo£imo i jo² jednu sitnicu: metode u su£elju nisu

ozna£ene kao

jer se to podrazumijeva  nemogu¢e je u su£elju imati

metodu koja ne bi bila javna. Klasu ovako:

„exten—lyzer

moºemo koristiti npr.

Ispis 1.13: Polimorzam na djelu

POGLAVLJE 1.

OSNOVNI ELEMENTI JEZIKA JAVA

15

pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { „exten—lyzer t—I a new „exten—lyzer@ new ƒimplegounter@AD new „extpile@ QU A AY „exten—lyzer t—P a new „exten—lyzer@ new wodulogounter@AD new „extpile@ QU A AY int ™ountI a t—IF™ountvines@AY int ™ountP a t—PF™ountvines@AY ƒystemFoutFprintln@ 4ƒimplegounter je iz˜roj—o 4 C ™ountI AY ƒystemFoutFprintln@ 4wodulogounter je iz˜roj—o 4 C ™ountP AY

}

O£ekivani ispis:

ƒimplegounter je iz˜roj—o QU wodulogounter je iz˜roj—o U
Prisutnost polimorzma moºemo uo£iti ve¢ u prvom retku koda. Konstruktoru klase

„exten—lyzer,

koji je deniran da prima argumente vrste

gounter,

proslježuje se referenca na instancu klase

ƒimplegounter.

Jezi£na

pravila to dopu²taju jer objekt

ƒimplegounter

implementira su£elje

gounter

(uz sitan dodatak, prikazan u ispisu 1.15) i nad njim je mogu¢e pozvati sve metode deklarirane u su£elju. U drugom retku istom konstruktoru proslježuje se referenca na instancu druge klase  ovaj put

wodulogounter. U tre¢em t—I
i

i £etvrtom retku najjasnije se vidi djelovanje polimorzma. Nad

t—P

poziva se ista metoda s identi£nim argumentom. Time se pokre¢e identi£an kod metode

™ountvines

(ispis 1.11). Mežutim, ta dva poziva rezultiraju raz-

li£itim povratnim vrijednostima, ²to se manifestira u ispisu u posljednja dva retka. Razlika nastupa u trenutku izvr²avanja retka gdje se donosi odluka koju to£no metodu

thisF™ntrFin™rement@A,
treba pozvati. U pra u drugom

in™rement@A

vom slu£aju to ¢e biti metoda denirana u klasi slu£aju u

ƒimplegounter,

wodulogounter.

Dakle, taj redak propisuje samo

ime

metode koju

¢e se pozvati (i parametre koje ona mora imati), ali ne veºe se ni uz jednu konkretnu metodu. Ovaj postupak zove se

dinami£ko povezivanje 

za raz-

liku od stati£kog, gdje se u trenutku prevoženja (kompajliranja) donosi kona£na odluka o tome koja metoda ¢e biti pozvana. Novu situaciju sa su£eljem moºemo vizualizirati UML-ovim dijagramom sa slike 1.5. Ovakav stil dizajna, u usporedbi s dizajnom sa slike 1.4, od presudne je vaºnosti u objektno-orijentiranim jezicima. Gotovo bi se moglo re¢i da je £injenica da omogu¢uju takav dizajn smisao njihovog postojanja.

16

POGLAVLJE 1.

OSNOVNI ELEMENTI JEZIKA JAVA

Uz malu izmjenu na ispisu 1.13 moºemo pokazati jo² jedan tipi£an na£in kori²tenja polimorzma: Ispis 1.14: Jo² jedan primjer kori²tenja polimorzma

pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { gounter ™ntrI a new ƒimplegounter@AY gounter ™ntrP a new wodulogounter@AY „exten—lyzer t—I a new „exten—lyzer@ ™ntrI AY „exten—lyzer t—P a new „exten—lyzer@ ™ntrP AY } FFF ost—t—k identi£—n k—o gore FFF

Ovdje se u prva dva retka varijablama vrste na instance klasa

gounter pridjeljuju reference
Zatim se s tim vaOvaj uzorak, gdje se za

ƒimplegounter

odnosno

wodulogounter.

rijablama poziva konstruktor klase

„exten—lyzer.

vrstu varijable koristi su£elje umjesto konkretne klase, vrlo je uobi£ajen u praksi. Isto vrijedi i za vrste atributa. Su£elje se redovito koristi i, kao ²to smo vidjeli u primjeru, za vrste parametara  a takožer i za vrste povratnih vrijednosti metoda. Na£elno, uvijek treba koristiti najop¢enitiju vrsta koja dolazi u obzir  a to je u na²im primjerima su£elje

gounter.

-cntr TextAnalyzer 1 +countLines() : int 1 «interface» Counter +increment() +getState() : int

SimpleCounter +increment() +getState() : int

ModuloCounter +increment() +getState() : int

Slika 1.5: UML-ov dijagram klasa za polimorfni analizator teksta (klasa

„extpile

je ovdje izostavljena)

U Javi svaka klasa mora se unaprijed obvezati koja sve su£elja (moºe ih biti vi²e) ¢e implementirati. U na²em slu£aju bit ¢e potrebno dodati redak  implements

gounter

u deklaracije obiju klasa. Puni kod tako izmijenjenih

15: Obvezivanje na implementaciju su£elja pu˜li™ ™l—ss ƒimplegounter implements gounter { priv—te int ™ounterƒt—teY pu˜li™ ƒimplegounter@ int initi—lƒt—te A { thisF™ounterƒt—te a initi—lƒt—teY } pu˜li™ ƒimplegounter@A { } pu˜li™ void in™rement@A { thisF™ounterƒt—teCCY } pu˜li™ int getƒt—te@A { return thisF™ounterƒt—teY } } pu˜li™ ™l—ss wodulogounter implements gounter { priv—te int ™ounterƒt—teY pu˜li™ wodulogounter@ int initi—lƒt—te A { thisF™ounterƒt—te a initi—lƒt—te 7 IHY } pu˜li™ wodulogounter@A { } pu˜li™ void in™rement@A { if @ thisF™ounterƒt—te aa W A thisF™ounterƒt—te a HY else thisF™ounterƒt—teCCY . Ispis 1.15.POGLAVLJE 1. OSNOVNI ELEMENTI JEZIKA JAVA 17 klasa prikazan je na ispisu 1. Primijetimo i mali dodatak u konstruktoru klase wodulogounter kojim se osigurava od slu£aja zadavanja prevelikog po£etnog broja uzimanjem ostatka dijeljenja s 10.

je ponavljanje koda u dvije o£ito srodne klase. Nakon toga moºemo predenirati (nadja£ati. a u kompleksnijem kodu moºe prerasti i u puno ve¢i problem. Ispis 1. U na²em slu£aju mogli bismo postupiti tako ne nastaje od nule. OSNOVNI ELEMENTI JEZIKA JAVA } pu˜li™ int getƒt—te@A { return thisF™ounterƒt—teY } } 1. eng.16: Naslježivanje  osnovna klasa pu˜li™ ™l—ss ƒimplegounter implements gounter { int ™ounterƒt—teY pu˜li™ ƒimplegounter@ int initi—lƒt—te A { thisF™ounterƒt—te a initi—lƒt—teY } pu˜li™ ƒimplegounter@A { } pu˜li™ void in™rement@A { . derived ) iz klase ƒimplegounter. inheritance ). Java omogu¢uje tehniku kojom se takvo ponavljanje moºe izbje¢i  nas- lježivanje (eng. u prvom retku konstruktora moºemo pozvati odgovaraju¢i konstruktor iz natklase i time prepustiti njemu odraživanje zajedni£kog dijela posla. Mežutim. ve¢ da je da propi²emo da klasa izvedena (eng. U tom slu£aju ona ¢e naslijediti sve njene metode i atribute.8 Izbjegavanje ponavljanja koda naslježivanjem Ono ²to nas u ispisu 1. Konstruktori se ne naslježuju i moramo ih uvijek pisati iznova. override ) one metode £ija implementacija vi²e ne odgovara (metodu wodulogounter in™rement). Obje klase koriste isti atribut. odnos Izvodom se izmežu wodulogounter i ƒimplegounter uspostavlja potklasa -natklasa.18 POGLAVLJE 1. a i metoda getƒt—te im je identi£na.15 moºe zasmetati.

Ova tehnika je vrlo prikladna u u£estaloj situaciji iz prakse gdje je posao koji obavlja izvorna metoda ve¢inom ispravan. Implementacija je izvedena tako da se prvo pozove izvorna implementacija iz natklase (superFin™rement). a ako ju poziva. nije nuºno da to £ini u prvom retku koda. Op¢enito. nadja£avaju¢a metoda nema obvezu pozivati metodu iz natklase.3. Prou£imo novu implementaciju metode potklase in™rement u potklasi. u odjeljku 1. a zatim se korigira slu£aj kad broja£ dože do 10 i treba ga poni²titi. Time je njegova dostupnost pro²i- rena na paketno-privatnu (eng.POGLAVLJE 1. Poziv pomo¢u u zapisu konstruktora  vi²e o ovome u odjeljku 2. pa tako i iz wodulogounter. OSNOVNI ELEMENTI JEZIKA JAVA 19 } thisF™ounterƒt—teCCY } pu˜li™ int getƒt—te@A { return thisF™ounterƒt—teY } Ispis 1. ali ga treba jo² malo korigirati ili pro²iriti.17: Naslježivanje  izvedena klasa pu˜li™ ™l—ss wodulogounter extends ƒimplegounter { pu˜li™ wodulogounter@ int initi—lƒt—te A { super@ initi—lƒt—te 7 IH AY } pu˜li™ wodulogounter@A { } dyverride pu˜li™ void in™rement@A { superFin™rement@AY if @ thisF™ounterƒt—te aa IH A thisF™ounterƒt—te a HY } } U ovom slu£aju bili smo prisiljeni pro²iriti dostupnost atributu ™ounterE ƒt—te klasa uklanjanjem modikatora priv—te.12. super koristi se i .10). package-private ) razinu: dostupan je iz svih unutar istog paketa (o tome kasnije.

Ova organizacija je rije²ila problem ponavljanja koda. Njegovo kori²tenje je opcionalno. Javin in™rement u wodulogounter-u pojavljuje se i dyverride. sad se pojavio novi problem. Dosad je bilo nagla²eno da polimorzam omogu¢uje instancama razli£itih klasa da se pona²aju kao da su instance su£elja koje implementiraju.9 Klasna hijerarhija. ali korisno. 1.16 prikazan je na slici 1.6. recimo inkrement. implementira sva su£elja koja implementira njena natklasa. Takve pogre²ke ponekad je te²ko uo£iti jer ¢emo time umjesto nadja£avanja denirati novu metodu a da toga nismo svjesni. samom prirodom naslježivanja. apstraktna klasa «interface» Counter +increment() +getState() : int SimpleCounter -counterState : int +increment() +getState() : int ModuloCounter +increment() Slika 1. navedemo krivo ime metode. Isto se odnosi i na slu£aj instance izvedene klase  ona se moºe koristiti i kao instanca svoje natklase. Postoje razne vrste nazna£uje da ta metoda nadja£ava annotation. Uo£imo jo² i sljede¢e: klasa wodulogounter ne ponavlja izjavu implements gounter jer se to podrazumijeva  potklasa automatski. annotation -a. Time prevoditelju dajemo do znanja da predvižamo da ta metoda nadja£ava metodu iz natklase pa ¢e nas on upozoriti ako pogrije²imo i npr. U ovom slu£aju to zna£i da sve instance klase . primjedba uz metodu.16 UML-ov dijagram slu£aja iz ispisa 1.6: UML-ov dijagram klasa iz ispisa 1.20 POGLAVLJE 1. OSNOVNI ELEMENTI JEZIKA JAVA Iznad denicije metode To je tzv. a ovdje kori²ten Override metodu iz natklase. Mežutim.

Moºemo apstraktnu klasu: Ispis 1. zahtijevati argument op¢enite vrste gounter. S druge strane.POGLAVLJE 1. Logi£no slijedi da se ovakvu klasu ne smije mo¢i instancirati jer je opis njenog pona²anja nepotpun  ne zna se ²to bi se trebalo dogoditi prilikom poziva metode in™rement.18: Apstraktna klasa —˜str—™t ™l—ss e˜str—™tgounter implements gounter { int ™ounterƒt—teY pu˜li™ e˜str—™tgounter@ int initi—lƒt—te A { thisF™ounterƒt—te a initi—lƒt—teY } pu˜li™ e˜str—™tgounter@A { } pu˜li™ int getƒt—te@A { return thisF™ounterƒt—teY } } pu˜li™ —˜str—™t void in™rement@AY in™rement. Ovu situaciju moºemo iz- bje¢i uz uporabu vi²e koda. Op- ¢enito. Glavna novost ovdje je metoda Najavljeno je njeno postojanje. Upravo tu zabranu uvodi modikator —˜str—™t nad klasom. najvje- rojatnije je da metoda o£ekuje objekt s pona²anjem deniranim u ƒimpleE gounter i ne¢e ispravno raditi s druga£ijim objektima. OSNOVNI ELEMENTI JEZIKA JAVA 21 wodulogounter moºemo tretirati kao da je njihova vrsta ƒimplegounter. svaku klasu smije se proglasiti apstraktnom i time zabraniti njeno instanciranje  bez obzira ima li ona apstraktnih metoda ili ne. Ako npr. ali jo² uvijek zadrºavaju¢i tu prednost da se ne ponavlja deklaracija atributa ni implementacija metode u hijerarhiju ubaciti getƒt—te. U protivnom je mogla npr. postojanje ijedne apstraktne metode prisiljava nas da takvu klasu proglasimo apstraktnom. negdje imamo deklariranu metodu void setƒimplegounter@ ƒimplegounter ™ntr A ona ¢e uredno prihvatiti i argument vrste wodulogounter. Mežutim. . koja je sad postala apstraktna. ali nema implementacije.

Takva situacija bolje odgovara ulozi jedne i druge klase. a metoda implementirana je u svakoj konkretnoj klasi posebno. Sad su obje konkretne klase izvedene iz e˜str—™tgounter. OSNOVNI ELEMENTI JEZIKA JAVA Koji je smisao ovog zahvata? Pogledajmo preureženi kod dviju otprije poznatih klasa: Ispis 1.7. koje .22 POGLAVLJE 1. in™rement Sav zajedni£ki kod nalazi se u ap- straktnoj klasi.19: Konkretne klase izvedene iz apstraktne pu˜li™ ™l—ss ƒimplegounter extends e˜str—™tgounter { pu˜li™ ƒimplegounter@ int initi—lƒt—te A { super@ initi—lƒt—te AY } pu˜li™ ƒimplegounter@A { } dyverride pu˜li™ void in™rement@A { thisF™ounterƒt—teCCY } } pu˜li™ ™l—ss wodulogounter extends e˜str—™tgounter { pu˜li™ wodulogounter@ int initi—lƒt—te A { super@ initi—lƒt—te 7 IH AY } pu˜li™ wodulogounter@A { } dyverride pu˜li™ void in™rement@A { if @ thisF™ounterƒt—te aa W A thisF™ounterƒt—te a HY else thisF™ounterƒt—teCCY } } Ovu situaciju prikazuje UML-ov dijagram na slici 1.

Vrijeme je da se razjasni taj pojam.19 1.18 da je za klasu gounter.10.1 Paketi.POGLAVLJE 1. ovako: p—™k—ge hrFferFtelFjsemY pu˜li™ interf—™e gounter { void in™rement@AY int getƒt—te@AY } .18 i 1. Stoga je njena vidljivost smanjena na samo «interface» Counter +increment() +getState() : int AbstractCounter -counterState : int +increment() +getState() : int SimpleCounter +increment() ModuloCounter +increment() Slika 1. Jezik Java omogu¢ava grupiranje vi²e klasa u jednu cjelinu koja se naziva paketom. Umjesto toga treba gounter.7: UML-ov dijagram klasa iz ispisa 1. imenovanje klasa i su£elja Koncepcija paketa Dosad se ve¢ vi²e puta spominjala koncepcija paketa. OSNOVNI ELEMENTI JEZIKA JAVA 23 su po svojoj prirodi dvije paralelne implementacije su£elja jo² na ispisu 1. a i da ga se stavi u potpunu uporabu u kodu. Uo£imo e˜str—™tgounter izostavljen modikator pu˜li™. e˜str—™tgounter.10 1. npr. Pripadnost klase paketu objavljuje se u prvom retku datoteke u kojoj je denirana. Ona ima pomo¢ni karakter i ne bi trebala sluºiti da se deklariraju varijable ili parametri £ija vrsta je uvijek koristiti su£elje unutar svog paketa.

Java podrºava i uvoz pojedinih imena klasa/su£elja tako da se na njih moºe pozivati samo kratkim imenom. Da kod ipak ne bi postao previ²e zagu²en ovako duga£kim imenima. na koje ¢e se dodavati jo² segmenata po potrebi. kao u Postoji i poseban paket navedeno ²to su j—v—xFswingFB. i to tako da se kre¢e od segmenta najvi²e hijerarhijske razine. Ve¢ je vjerojatno o£ito da su na snazi i posebna pravila imenovanja paketa: on se imenuje prema imenu internetske domene organizacije pod £ijom kapom se izražuje kod. ali u bilo kojem drugom paketu to postaje potrebno. Za to sluºi klju£na rije£ import koja se pojavljuje odmah ispod deklaracije paketa: p—™k—ge hrFferFtelFjsemY import j—v—FutilFvistY import j—v—FutilFerr—yvistY import j—v—xFswingFBY pu˜li™ ™l—ss ˆyz { FFF } Kori²enjem zvjezdice.10. tako da sav na² dosada²nji kod u tom smislu odudara od prakse i svaku datoteku treba dopuniti tom deklaracijom.24 POGLAVLJE 1. kao da je uvijek U njemu su najvaºnije ugražene klase kao import j—v—Fl—ngFB. Iz istog razloga treba dobro paziti koja imena . i ƒtring y˜je™t. kao u na²em primjeru hrFferFtelFjsem. U kodu svih klasa unutar tog istog paketa ne mora se navoditi puno ime. uvozi se kompletan paket. U tom slu£aju opet ¢emo imati glavno ime. Upravo zato su denirana gornja pravila imenovanja paketa koja osiguravaju jedinstvenost njegovog imena.2 Pravila imenovanja paketa U praksi se paketi redovito koriste. OSNOVNI ELEMENTI JEZIKA JAVA Time se su£elje govo puno ime gounter na²lo u paketu hrFferFtelFjsem i sada je nje- hrFferFtelFjsemFgounter. Na² Zavod ima domenu telFferFhr i stoga sva imena Za sasvim paketa izraženih na Zavodu trebaju po£injati na hrFferFtel. 1. ali ve¢ za samo malo ve¢e trebat ¢e ih obi£no vi²e. male projekte bit ¢e dovoljan jedan paket. Paketi se primjenjuju prije svega zato da ne dože do sudara izmežu imena klasa koje kreiraju razli£iti autori i imaju razli£ite namjene. j—v—Fl—ng koji je automatski uvezen.

koje su dosad bile u neimenovanom.10. Uvozom pogre²nog imena do¢i ¢e do vrlo £udnih pogre²aka gdje se prevoditelj (kompajler) buni za svaku metodu koju pozivamo. Na primjer.3 Pravila za raspored datoteka po kazalima Ime paketa u kojem je klasa povla£i za sobom i propis u kojem kazalu ona mora biti smje²tena u sustavu datoteka. Time razvijatelj paketa moºe imati bolju kontrolu nad time kako ¢e se . 1. OSNOVNI ELEMENTI JEZIKA JAVA 25 se uvoze da se ne bi uvezlo pogre²no. 1. u ovom trenutku trebalo bi sve datoteke. Korisniku svih tih paketa ne¢e biti dostupni oni dijelovi koji nisu ozna£eni kao javni (pu˜li™). Doti£ni jo² ne postoji pa ga se u prozoru koji se pojavio stvori pomo¢u gumba New. Po£ev²i od nekog proizvoljnog kazala koje se progla²ava korijenskim potrebno je izgraditi hijerarhiju kazala identi£nu hijerarhiji segmenata u imenu paketa. formalno izmežu dva paketa razli£itog imena ne postoji nikakva povezanost. Bez obzira na ovakav hijerarhijski na£in organiziranja paketa po kazalima. paket hrFfer nije u ni²ta bliºem odnosu s paketom ™omFsun.10. dvije klase vrlo razli£itih namjena. Dakle. Ime same datoteke takožer je propisano i mora biti jednako imenu klase deklarirane u njoj.4 Uloga paketno-privatne razine dostupnosti Sad se moºe bolje razumjeti ono ²to se ranije govorilo o razini dostupnosti atributa. Na primjer. iako sve izgleda ispravno. datoteka gounterFj—v— mora se na¢i u kazalu `korijenskobGhrGferGtelGjsem. tzv. podrazu- mijevanom ili zgodan na£in korijenskom paketu. odnosno dostupan je odmah nakon instaliranja Jave na ra£unalo. metoda i klasa. hrFferFtel nego s npr. Konkretno. Jedan u okruºju Eclipse je da se u Package Explorer-u ozna£i sve klase i pritisne kombinacija tipaka Alt-Shift-V. Ve¢ina samih softverskih proizvoda takožer su takve prirode da trebaju sluºiti drugim razvijateljima kao gradivni elementi. £ime se zahtijeva preseljenje klasa u drugi paket.POGLAVLJE 1. preseliti u paket hrFferFtelFjsem. u standardnu biblioteku klasa koja dolazi s Javom ugraženi su i j—v—F—wtFvist i j—v—FutilFvist. paketom Svaki razvojni alat automatski se brine za po²tivanje svih ovih pravila i stoga je bitno koristiti tu njegovu podr²ku. Svaki razvojni projekt u Javi oslanja se na velik broj klasa i su£elja koja ve¢ postoje  mnogo njih dolazi ve¢ kao dio samog jezika.

18 i 1. Gledaju¢i trenutno stanje na²eg koda (ispisi 1. To ¢emo ovdje iskoristiti: uvest ¢emo novu.26 POGLAVLJE 1. Uvijek je dobro svaku . uklanjanje oznake pu˜li™ s klase e˜str—™tgounter sprije£it ¢e korisnka na²eg paketa da radi izravno s tom klasom. Dosad smo se susreli s enkapsulacijom atributa kao jednom od najosnovnijih tehnika dizajna. a na drugom do 9.19). ciklus od nula do 7. Dakle. Na primjer. a time ¢e nestati in™rement ima razli£ite implementacije  ona ¢e se os- lanjati na promjenjivo pona²anje metode se da je setƒt—te. Takva situacija otvara mogu¢nost za nekonzistentnost  moºe se gre²kom dogoditi da se na jednom mjestu name¢e npr. Iz perspektive koda koji barata objektima vrste dogodila nikakva promjena. Metoda setƒt—te nije dio javnog su£elja objekta i stoga se denicija gounter-a ne mijenja. Vi²e je na£ina za to. Klasa wodulogounter na dva neovisna mjesta name¢e ciklus brojanja od nula do devet: posebno u konstruktoru i u metodi in™rement.11 Refaktorizacija Kako smo napredovali u izgradnji koda na²eg primjera. svaka od dviju na²ih konkretnih klasa imat ¢e svoju implementaciju potreba da metoda setƒt—te. paketno-privatnu metodu setƒt—te koja ¢e se pozivati prilikom svake promjene stanja i u kojoj ¢e se provoditi kontrola nailaska na gornju granicu ciklusa.1 Modikator final  kontrola polimorzma fin—l U novi kod apstraktne klase dodan je jo² jedan detalj: modikatorom ozna£ene su metode koje je zabranjeno nadja£avati. Konstruktor ¢e takožer pozivati ovu metodu. a i zadrºava slobodu kasnijih izmjena nad svim dijelovima koji nisu javni. 1. u vi²e navrata radili smo prepravke u kodu s ciljem njegove bolje organizacije (npr. Kasnije ju moºemo npr. Poºeljno je provesti jo² jednu refaktorizaciju koja ¢e ovo otkloniti. gounter nije se 1. izbjegavanje ponavljanja). OSNOVNI ELEMENTI JEZIKA JAVA njegov kod koristiti: olak²ava korisniku ispravno kori²tenje. Za takvu metodu kaºe polimorfna. £esto je korisno enkapsulirati i metode. opet moºemo uo£iti jednu sitnicu koja bi se mogla popraviti. preimenovati ili moºda potpuno ukinuti bez utjecaja na korisnika na²eg paketa. a bez utjecaja na pona²anje objekata.11. Mežutim. Takve izmjene u£estale su u razvoju softvera i nazivaju se refaktorizacijom. ali ovdje ¢emo pokazati jedan koji sadrºi i neke novosti u dizajnu objekata.

Time se ponovo osigurava od polimorzma tamo gdje je on nepoºeljan  ako npr. To je prakti£nije i za programera koji dodaje novu potklasu jer taj modikator isti£e ulogu metode u £itavoj organizaciji klasa i ukazuje na to kako ispravno uvesti novu klasu. a ne neke potklase s izmijenjenim pona²anjem. garantirano je da ¢e prosliježeni objekt biti instanca upravo te klase. . Oznaka fin—l na metodi garantira da nije potrebno pregledavati sve potklase da se ustanovi nije li neka od njih nadja£ala tu metodu. moºe i oteºati £itanje koda upravo zbog toga ²to pravila odabira metode koja ¢e biti pozvana postaju znatno sloºenija. Polimorzam. Takav nepoºeljan slu£aj upravo smo imali ranije. OSNOVNI ELEMENTI JEZIKA JAVA 27 metodu za koju je predviženo da bude ista za sve potklase ozna£iti kao fin—l. Kad dje- luje na klasu. osim ²to daje eksibilnost. parametar neke metode ima vrstu ƒimplegounter. Ispis 1. prije uvoženja apstraktne klase.20: Nova verzija apstraktne klase p—™k—ge hrFferFtelFjsemY —˜str—™t ™l—ss e˜str—™tgounter implements gounter { int ™ounterƒt—teY pu˜li™ e˜str—™tgounter@ int initi—lƒt—te A { setƒt—te@ initi—lƒt—te AY } pu˜li™ e˜str—™tgounter@A { } pu˜li™ fin—l int getƒt—te@A { return thisF™ounterƒt—teY } pu˜li™ fin—l void in™rement@A { setƒt—te@ getƒt—te@A C I AY } } —˜str—™t void setƒt—te@ int newƒt—te AY fin—l U ispisima koji slijede modikatorom ozna£ene su klase. ovaj modikator zabranjuje deklaraciju klase izvedene iz nje.POGLAVLJE 1.

12 Uvoženje vi²e varijanti iste metode  preoptere¢enje Ovisno o tome za ²to nam sve treba broja£. . OSNOVNI ELEMENTI JEZIKA JAVA Ispis 1. zahtjev da treba omogu¢iti i ve¢e korake brojanja umjesto samo po jedan.21: Nove konkretne klase p—™k—ge hrFferFtelFjsemY pu˜li™ fin—l ™l—ss ƒimplegounter extends e˜str—™tgounter { pu˜li™ ƒimplegounter@ int initi—lƒt—te A { super@ initi—lƒt—te AY } pu˜li™ ƒimplegounter@A { } dyverride void setƒt—te@ int newƒt—te A { thisF™ounterƒt—te a newƒt—teY } } p—™k—ge hrFferFtelFjsemY pu˜li™ fin—l ™l—ss wodulogounter extends e˜str—™tgounter { pu˜li™ wodulogounter@ int initi—lƒt—te A { super@ initi—lƒt—te AY } pu˜li™ wodulogounter@A { } dyverride void setƒt—te@ int newƒt—te A { thisF™ounterƒt—te a newƒt—te 7 IHY } } 1.28 POGLAVLJE 1. mogao bi se pojaviti npr.

Ispis 1. . Ta cjelina naziva se metode potpisom metode i (eng. OSNOVNI ELEMENTI JEZIKA JAVA 29 U tom slu£aju mogli bismo poja£ati na²e objekte novom varijantom metode in™rement koja prima i jedan brojevni parametar. Tada ¢emo imati dvije metode istog imena. ali razli£itih parametara  to se zove preoptere¢enjem metode (eng. a metoda bez parametara je u biti njen poseban slu£aj u kojem se podrazumijeva jedini£ni korak. ’to se ti£e jezika Java. Konkretno. koju se poziva s podrazumijevanom vrijednosti. overloading ).23: Pro²irenje apstraktne klase p—™k—ge hrFferFtelFjsemY —˜str—™t ™l—ss e˜str—™tgounter implements gounter { FF po£et—k kod— identi£—n k—o r—nije FFF pu˜li™ fin—l void in™rement@A { in™rement@ I AY } pu˜li™ fin—l void in™rement@ int step A { setƒt—te@ getƒt—te@A C step AY } } —˜str—™t void setƒt—te@ int newƒt—te AY Moºemo uo£iti tipi£an pristup koji se koristi u izgradnji sustava preoptere¢enih metoda: metoda koja prima cijeli broj je op¢enitija.22: Pro²ireno su£elje gounter pu˜li™ interf—™e gounter { void in™rement@AY void in™rement@ int step AY int getƒt—te@AY } Ispis 1.POGLAVLJE 1. signature ). Uo£imo da s druge strane povratna vrijednost ne ulazi u potpis metode i ne smije se denirati dvije metode koje su iste po svemu osim po povratnoj vrijednosti. ovdje ¢emo imati in™rement@A in™rement@ int A. te dvije metode jednako su razli£ite kao da imaju i razli£ita imena jer se potpuni identitet metode sastoji od njenog imena i popisa vrsta parametara koje prima. Stoga se poziv metode bez parametara delegira na op¢enitiju metodu.

Ako ºelimo imati oba svojstva  i da se objekt dobiva izvana. copy constructor ) u kombinaciji s posebnom getgopy. i da se primjenjuje £ista kompozicija  bit ¢e potrebno omogu¢iti kopiranje objekata. Konstruktor klase broja£a i ugražuje ju u svoju instancu.30 POGLAVLJE 1.13 Prijelaz s agregacije na kompoziciju  kopiranje objekata „exten—lyzer zaprima gotovu instancu U ispisu 1. Su£elje broja£a moramo pro²iriti ovom metodom: Ispis 1. Daljnje promjene nad objektom dobivenim izvana ne¢e utjecati na njegov rad. U Javi postoji poseban mehanizam za ovo  metoda ™lone  mežutim. Ovdje ¢emo stoga prikazati preporu£enu alternativu  kopiraju¢i konstruktor metodom (eng. U ve¢ini situacija iz prakse ovdje ¢e ustvari isto biti potrebna prava kompozicija da bi se analizator teksta za²titio od neºeljenih intervencija izvana. Ovdje se donosi primjer za ƒimplegounter. ali privatan.4.11 denirana je klasa koja primjenjuje agregaciju. Analizator teksta zaprimit ¢e objekt izvana i od njega napraviti obrambenu kopiju (eng. OSNOVNI ELEMENTI JEZIKA JAVA Primjer kori²tenja preoptere¢enih metoda: pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { gounter ™ntr a new ƒimplegounter@AY ™ntrFin™rement@AY ƒystemFoutFprintln@ 4ƒt—nje n—kon poziv— in™rement@AX 4 C ™ntrFgetƒt—te@A AY ™ntrFin™rement@ P AY ƒystemFoutFprintln@ 4ƒt—nje n—kon poziv— metode in™rement@ P AX 4 C ™ntrFgetƒt—te@A AY } 1.24: Dodatak metode za kopiranje u su£elje gounter pu˜li™ interf—™e gounter { void in™rement@AY void in™rement@ int step AY int getƒt—te@AY gounter getgopy@AY } Implementacije ove metode koristit ¢e kopiraju¢e konstruktore. defensive copy )  identi£an objekt. on se zbog odreženih tehni£kih problema po£eo izbjegavati. . za wodulogounter postupa se analogno. ²to je ilustrirano slikom 1.

25: Klasa ƒimplegounter s dodanom podr²kom za kopiranje p—™k—ge hrFferFtelFjsemY pu˜li™ fin—l ™l—ss ƒimplegounter extends e˜str—™tgounter { pu˜li™ ƒimplegounter@ int initi—lƒt—te A { super@ initi—lƒt—te AY } pu˜li™ ƒimplegounter@A { } GG uopir—ju¢i konstruktor EE ˜roj—£ se post—vlj— n— GG istu vrijednost k—o u izvornikuF GG €riv—t—n3 ƒluºi s—mo k—o podr²k— metodi getgopy priv—te ƒimplegounter@ ƒimplegounter ™ntr A { thisF™ounterƒt—te a ™ntrF™ounterƒt—teY } pu˜li™ gounter getgopy@A { return new ƒimplegounter@ this AY } void setƒt—te@ int newƒt—te A { thisF™ounterƒt—te a newƒt—teY } } Metodu getgopy. Potrebna je samo sitna izmjena u konstruktoru : Ispis 1. . Klasu piranja. naºalost.26: Analizator teksta koji koristi kompoziciju 1 pu˜li™ ™l—ss „exten—lyzer { priv—te „extpile fileY priv—te gounter ™ntrY pu˜li™ „exten—lyzer@ „extpile fileD gounter ™ntr A 1 U konstruktoru se koristi i metoda getgopy iz klase „extpile. OSNOVNI ELEMENTI JEZIKA JAVA 31 Ispis 1. ne moºemo rije²iti op¢enito i staviti u apstraktnu „exten—lyzer jednostavno je prepraviti da koristi mehanizam ko- klasu jer u svakoj klasi treba stvarati instancu upravo te klase.POGLAVLJE 1. Njena implementacija nije prikazana u skripti.

32 POGLAVLJE 1. OSNOVNI ELEMENTI JEZIKA JAVA { } thisFfile a fileFgetgopy@AY thisF™ntr a ™ntrFgetgopy@AY } pu˜li™ int ™ountvines@A { while @ 3fileFend‚e—™hed@A A { fileFre—dvine@AY thisF™ntrFin™rement@AY } return ™ntrFgetƒt—te@AY } .

na f—lse. 2. Prevoditelj (kompajler) ¢e analizirati izvorni kod i prijaviti pogre²ku ako kod omogu¢ava £itanje varijable prije inicijalizacije. Varijable se usporežuju po vrijednosti na uobi£ajen 33 . za logi£ku vrstu. objekt Jedan od najbitnijih elemenata potrebnih za precizno razumijevanje jezi£nih konstrukcija u Javi jest pojam varijable. a lokalna varijabla ne.1 Varijabla primitivne vrste ˜oole—n. Varijabla je spremnik u radnoj memoriji kojem je dodijeljeno ime (iden- tikator) i vrsta podatka koji se u nju sprema. Ono ²to ¢e ovdje biti re£eno za varijablu vrijedi i za parametre metode. referenca. uhva¢ene iznimke i atribute objekta. Jedna od razlika izmežu lokalne varijable i atributa koju treba imati na umu je da se atribut inicijalizira automatski.Poglavlje 2 Razrada detalja jezi£nih svojstava 2.1. npr. Varijabla primitivne vrste je jednostavniji od dva slu£aja i poznat je iz jezika C. Vrijednost takve varijable je podatak primitivne vrste. int ili dou˜le. Jezik Java razlikuje varijable primitivne i referentne vrste. Sam podatak je izravno spremljen u varijablu i vrijednost va- rijable moºe se izmijeniti jednostavnom dodjelom: int iY GGdekl—r—™ij— v—rij—˜le i a PY GGprv— dodjel— vrijednosti @ini™ij—liz—™ij—A i a QY GGdrug— dodjel— vrijednosti FFF Atributi primitivne vrste inicijaliziraju se na vrijednost nula odnosno.1 Varijabla.

Vrijednost va- U varijablu referentne vrste sprema se rijable nikad nije sam objekt.34 POGLAVLJE 2. Ako varijablu proslijedimo kao argument metodi. akcije nad objektom obavljene unutar metode ostat ¢e vidljive na objektu i nakon ²to metoda zavr²i: . RAZRADA DETALJA JEZIƒNIH SVOJSTAVA na£in: int i a HY int j a HY if @ i aa j A ƒystemFoutFprintln@ 4†—rij—˜le im—ju istu vrijednost4 AY else ƒystemFoutFprintln@ 4†—rij—˜le im—ju r—zli£ite vrijednosti4 AY (ispisat ¢e se "Varijable imaju istu vrijednost"). Manipulacija objektom putem jedne varijable manifestirat ¢e se i kad se objektu pristupa putem druge varijable: gounter ™ntrI a new ƒimplegounter@AY gounter ™ntrP a ™ntrIY ƒystemFoutFprintln@ ™ntrIFgetƒt—te@A AY GG ispisuje 4H4 ™ntrPFin™rement@AY ƒystemFoutFprintln@ ™ntrIFgetƒt—te@A AY GG ispisuje 4I4 • Ako se metodi proslježuje objekt putem parametra referentne vrste. tako da promjene na toj kopiji ne utje£u na original: priv—te st—ti™ void usesnt@ int i A { iCCY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { int i a HY usesnt@ i AY ƒystemFoutFprintln@ i AY GG ispisuje 4H4 } 2. metoda ¢e dobiti vlastitu kopiju vrijednosti varijable.2 Varijabla referentne vrste referenca na objekt. ve¢ uvijek referenca na njega.1. pogotovo u sljede¢im situacijama: • Dvije varijable mogu imati referencu na isti objekt. To je vaºno imati na umu.

pokazuju na jedan te isti objekt. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 35 priv—te st—ti™ void usegntr@ gounter ™ntr A { ™ntrFin™rement@AY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { gounter ™ntrI a new ƒimplegounter@AY ƒystemFoutFprintln@ ™ntrIFgetƒt—te@A AY GG ispisuje 4H4 usegntr@ ™ntrI AY ƒystemFoutFprintln@ ™ntrIFgetƒt—te@A AY GG ispisuje 4I4 } • Vrijednost dviju varijabli je jednaka samo ako sadrºe istu referencu. Za usporedbu samih objekata mora se koristiti posebnu metodu 3. op¢enito njena vidljivost proteºe se uvijek od mjesta deklaracije do kraja bloka u kojem je deklarirana: pu˜li™ st—ti™ void method@A { int i a HY . ²to zna£i da ne sadrºi nikakvu referencu. equ—ls (odjeljak Varijabla referentne vrste moºe imati i posebnu vrijednost null. 2. Ako pokazuju svaka na svoj objekt. tj. Atributi referentne vrste se automatski inicijaliziraju na ovu vrijednost.1). Mežutim.POGLAVLJE 2. njihove vrijednosti ne¢e biti jednake bez obzira na to jesu li sami objekti mežusobno jednaki: pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { gounter ™ntrI a new ƒimplegounter@AY gounter ™ntrP a new ƒimplegounter@AY if @ ™ntrI aa ™ntrP A ƒystemFoutFprintln@ 4†—rij—˜le im—ju istu vrijednost4 AY else ƒystemFoutFprintln@ 4†—rij—˜le im—ju r—zli£ite vrijednosti4 AY } (ispisat ¢e se Varijable imaju razli£ite vrijednosti).3 Opseg vidljivosti (scope ) lokalne varijable Lokalna varijabla uobi£ajeno se deklarira unutar glavnog bloka metode.2.1.

16-bitni cijeli broj. .36 POGLAVLJE 2.2 Primitivne vrste podataka Jezik Java raspolaºe ograni£enim skupom primitivnih vrsta podataka. Denirane su sljede¢e vrste: • ˜oole—n: logi£ka vrijednost. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA } if @ i ba H A { int j a i C IY } jCCY GG prevoditelj prij—vljuje pogre²ku d— nije dekl—rir—n— Nijedna deklaracija lokalne varijable ne smije prekriti drugu lokalnu varijablu koja je na tom mjestu vidljiva: pu˜li™ st—ti™ void method@A { int i a HY if @ i ba H A { int i a QY GG prevoditelj se tuºi d— je v—rij—˜l— 9i9 ve¢ dekl—rir—n— } } Sintaksa petlje for omogu¢uje da se ve¢ prije otvorene vitice deklarira varijabla koja ¢e vrijediti unutar bloka petlje: pu˜li™ st—ti™ void method@A { for @ int i a HY i ` QQY iCC A { ƒystemFoutFprintln@ i 7 U AY } iCCY GG prevoditelj prij—vljuje pogre²ku d— nije dekl—rir—n— } 2. • short: • ™h—r: 16-bitni Unicode-ov znak. • ˜yte: 8-bitni cijeli broj (zapisan u jednom oktetu). 9\n9 za znak prelaska u novi redak. 9\t9 za znak tabulatora. poprima jednu od dvije konstante: true ili f—lse. npr. brojevima bez predznaka. Ne raspolaºe npr. Podrºane su doslovne vrijednosti. 9—9. Moºe se tretirati i kao broj.

npr Ei £i komplement broja bit-po-bit.3. Binarni operatori: • zbroj.3 Numeri£ki i logi£ki izrazi Jezik Java raspolaºe uobi£ajenim skupom unarnih i binarnih numeri£kih i logi£kih operatora. dou˜le za decimalne 2. • dou˜le: 64-bitni broj s plivaju¢im zarezom. npr. • pre-decrement. npr. 3. • pre-increment. Ovdje se donosi njihov kratak pregled.1 Numeri£ki operatori Unarni operatori: • • negacija broja. npr. kad nema posebno jakih razloga za kori²tenje nekog drugog. Preciznost je oko 15 de- cimalnih mjesta. koristi se za sve cijele brojeve op¢e namjene. i E j i B j umnoºak. npr. npr. • long: 64-bitni cijeli broj. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 37 • int: 32-bitni cijeli broj. Najbolje je rutinski koristiti brojeve.POGLAVLJE 2. 2. Preciznost je oko 6 deci- • flo—t: malnih mjesta. • post-decrement. npr. npr. 32-bitni broj s plivaju¢im zarezom.3) i C j. CCi --i iCC iEE • post-increment. isti znak koristi se i za operator ulan£avanja (vidjeti • • razlika. . npr.

npr. Brojevnu vrijednost nemogu¢e je tretirati kao logi£ku i obratno. • pomak udesno uz zero-extension. operacija operacija i i 8 j | j ¢ j aa (jednakost). bio pozitivan ili negativan. npr. b `a i `a. npr. 2. Za negativne brojeve naru²ava efekt dijeljenja potencijom broja dva.38 POGLAVLJE 2. • ostatak dijeljenja. npr. .2 Logi£ki operatori Java striktno razlikuje numeri£ke od logi£kih vrijednosti i izraza. `. Na ispraºnjena lijeva mjesta stavlja se vrijednost koju je imao najljeviji bit prije operacije. npr. — 8 ˜ — | ˜ • ili. npr. • pomak udesno uz sign-extension. i bbb j. • • • operacija . Drugim rije£ima. ili. ºeli posti¢i efekt dijeljenja s 2j . npr. Pravilo za rezultat operacije: @iGjABj C @i7jA a i Binarni operatori koji djeluju na razini bitova: • pomak ( shift ) ulijevo. £— • i. npr. i bb j. i 7 j. j Ako su i i j cijeli brojevi. Na ispraºnjena desna mjesta stav- ljaju se nule. rezultat ¢e biti cijeli broj puta koliko stane u i. i G j. Na ispraºnjena lijeva mjesta stavljaju se nule. rezultat se zaokruºuje prema nuli odnosno na manju apsolutnu vrijednost. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA • koli£nik. npr. Koristi se kad se nad cijelim brojem. i Za usporedbu brojeva koriste se operatori 3a (nejednakost). npr. Dostupni su sljede¢i operatori nad logi£kim vrijednostima: • negacija.3. i isklju£ivo ili. i `` j. npr.

— || ˜. — bio laºan. svi podaci niºe preciznosti bit ¢e implicitno pretvoreni u podatke vi²e preciznosti. 3.POGLAVLJE 2. 2. ˜ ¢e se izra£unavati jedino ako je izraz — bio istinit. gdje se radi o sasvim kratkim izrazima i gdje se time postiºe bolja £itljivost koda. Prvo se pro44. Ovaj operator nije primjereno koristiti kao op¢enitu zamjenu za konstrukciju if-then-else. — ¢ ˜ Izraz npr.3 Uvjetni (ternarni) operator Ovaj operator sluºi za odabir izmežu dva izraza od kojih ¢e jedan biti rezultat £itave operacije ovisno o zadanom uvjetu. a u protivnom je rezultat prazan niz. Tipi£an primjer uporabe: pu˜li™ st—ti™ void showirrorwess—ge@ ƒtring msg A { ƒtring fullwsg a 4irrorX 4 C @ msg 3a nullc msg X 44 AY ƒystemFoutFprintln@ fullwsg AY } Ternarni operator koristi se u izrazu vjerava uvjet je msg 3a nullc msg X 44. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 39 • isklju£ivo ili. npr. i dodaje — 8a ˜ varijabli — pridjeljuje rezultat operacije — 8 ˜.3.4 Operatori sloºene dodjele i Ca Q postoje¢oj vrijednosti varijable Za sve binarne operatore za koje je to smisleno postoje i odgovaraju¢i operatori sloºene dodjele. Jedino u slu£aju kad je nuºno da oba izraza uvijek budu izra£unata (zbog nekih dodatnih posljedica koje ti izrazi ostavljaju) treba koristiti bezuvjetne operatore. Razmotrimo ovaj primjer kori²tenja cijelih brojeva: . — 88 ˜. Ako je uvjet zadovoljen. msg 3a null.3. npr. Pretvorbe izmežu numeri£kih vrsta int i Ako se u numeri£kom izrazu koriste podaci razli£itih vrsta  npr. ve¢ samo u slu£ajevima kao gore. • uvjetno ili.3. Izraz ˜ ¢e se izra£unavati jedino ako je izraz Osim za posebne namjene treba uvijek koristiti uvjetne verzije operatora jer je to ra£unski ekonomi£nije. • uvjetno i. 2. 2. npr. itd.5 long. rezultat £itavog izraza msg.

4 Enumeracija pik. Java op¢enito po²tuje sljede¢e pravilo: ako zatreba pretvorba na ve¢u preciznost.40 POGLAVLJE 2.1: Implicitna pretvorba vrste cjelobrojnih podataka int intI a IY long longI a IY long longP a intIY longP a intI C longIY int intP a longIY GG pogre²k—3 intP a intI C longIY GG pogre²k—3 U tre¢em i £etvrtom retku vrijednost vrste int se pridjeljuje varijabli vrste long i to je ispravno. U softverskom razvoju vrlo £est slu£aj je da neki podatak moºe poprimiti svega nekoliko razli£itih vrijednosti. 2. kao i izmežu flo—t i dou˜le s jedne strane i cjelobrojnih vrsta s druge strane. Ovdje prevoditelj prijavljuje pogre²ku  „ype mism—t™hX ™—nnot ™onvert from long to int . ako zatreba pretvorba na manju preciznost. trebat ¢e podatak s £etiri mogu¢e vrijednosti ( tref ). tzv. Pogre²ke iz gornjeg primjera ispravit ¢emo ovako: Ispis 2. potrebno je ekplicitno zatraºiti konverziju. ako razvijamo neku karta²ku igru. ali naravno treba imati na umu opasnost od prekora£enja maksimalnog opsega jedi i za odnose izmežu int-a. karo. odvija se automatski.3: Jednostavna enumeracija p—™k—ge hrFferFtelFjsemY pu˜li™ enum ƒuit . enumeraciju.2: Eksplicitna pretvorba vrste cjelobrojnih podataka int intP a @intA longIY intP a @intA @ intI C longI AY Sad prevoditelj ne¢e prijaviti pogre²ku. Sve ovdje re£eno vri- flo—t i dou˜le. Najosnovniji slu£aj je vrlo jednostavan: Ispis 2. herc. u petom i ²estom retku poku²ava se vrijed- nost vrste long pridijeliti varijabli vrste int. Na primjer. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA Ispis 2. Mežutim. Za takve slu£ajeve treba denirati posebnu klasu.

op¢enito se ne moºe koristiti za referentne vrste.8) £ija vrsta je upravo ta klasa. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 41 { } ™lu˜sD di—mondsD he—rtsD sp—desY Enumeracija je ustvari obi£na klasa s javnim konstantama (vidjeti odjeljak 2.5: Kori²tenje enumeracije u bloku swit™h st—ti™ void printƒuitsngro—ti—n@ ƒuit suit A { ƒtring suitx—meY swit™h @ suit A { ™—se ™lu˜sX suitx—me a 4tref4Y ˜re—kY ™—se di—mondsX suitx—me a 4k—ro4Y ˜re—kY ™—se he—rtsX suitx—me a 4her™4Y ˜re—kY ™—se sp—desX suitx—me a 4pik4Y ˜re—kY def—ultX suitx—me a 44Y } ƒystemFoutFprintln@ 4foj— k—rte je 4 C suitx—me AY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { printƒuitsngro—ti—n@ ƒuitF™lu˜s AY printƒuitsngro—ti—n@ ƒuitFhe—rts AY } Da nema mogu¢nosti kori²tenja bloka swit™h. ²to znatno olak²ava zapis koda kao u sljede¢em primjeru: Ispis 2.POGLAVLJE 2. ali Konstrukcija swit™h posebno je omogu¢ena za enumeraciju. morali bismo pisati ovako: .4: Osnovno kori²tenje enumeracije pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒuit suitID suitPY suitI a ƒuitF™lu˜sY suitP a ƒuitFhe—rtsY ƒystemFoutFprintln@ 4€rv— ˜oj—X 4 C suitI C 4Y drug— ˜oj—X 4 C suitP AY } Odmah moºemo uo£iti da £lanovi enumeracije imaju ispravno implementiranu metodu toƒtring koja vra¢a ime £lana. To moºemo vidjeti na sljede¢em primjeru kori²tenja enumeracije: Ispis 2.

dodati hrvatsko ime boje: Ispis 2. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA if @ suit aa ƒuitF™lu˜s A suitx—me a 4tref4Y else if @ suit aa ƒuitFdi—monds A suitx—me a 4k—ro4Y else if @ suit aa ƒuitFhe—rts A suitx—me a 4her™4Y else if @ suit aa ƒuitFsp—des A suitx—me a 4pik4Y else suitx—me a 44Y Primijetimo da je £lanove enumeracije uvijek sigurno usporeživati po referenci.1). operatorom aa. Izmežu £lanova enumeracije utvržen je poredak koji odgovara poretku kojim su navedeni u deniciji enumeracije. Sve enumeracije implementiraju i su£elje gomp—r—˜le (vidjeti odjeljak 5.42 POGLAVLJE 2.6: Oboga¢ena enumeracija p—™k—ge hrFferFtelFjsemY pu˜li™ enum ƒuit { ™lu˜s@ 4tref4 AD di—monds@ 4k—ro4 AD . Dodatna prednost konstrukcije ²to omogu¢uje prevoditelju da nas upozori ako smo slu£ajno izostavili neki £lan enumeracije.6. ovakav kod: pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒuit suitID suitPY suitI a ƒuitF™lu˜sY suitP a ƒuitFhe—rtsY int differen™e a suitIF™omp—re„o@ suitP AY if @ differen™e aa H A ƒystemFoutFprintln@ 4foje su iste4 AY else if @ differen™e b H A ƒystemFoutFprintln@ 4€rv— ˜oj— po˜ježuje34 AY else ƒystemFoutFprintln@ 4hrug— ˜oj— po˜ježuje34 AY } Kao i ostale klase. To nam omogu¢uje da napi²emo npr. U na²em slu£aju mogli bismo npr. i enumeraciju je mogu¢e pro²irivati dodatnim atributima i metodama. jer je njihova priroda takva da su svaka dva distinktna swit™h je u tome £lana mežusobno razli£iti.

5 Konstrukcije za upravljanje slijedom izvr²avanja if. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 43 he—rts@ 4her™4 AD sp—des@ 4pik4 AY priv—te ƒtring ™rox—meY priv—te ƒuit@ ƒtring n—me A { thisF™rox—me a n—meY } pu˜li™ ƒtring getgrox—me@A { return thisF™rox—meY } } Ovdje smo dodali instancin atribut konstruktor i metodu metode ™rox—me.POGLAVLJE 2. Ovdje ¢e one biti prikazane samo u najkra¢im Jezik Java raspolaºe upravlja£kim konstrukcijama poznatim iz jezika C: while. crtama. for i swit™h. Ispis 2. kroz minimalisti£ki primjer.7: Kratki primjeri uporabe upravlja£kih konstrukcija st—ti™ void ™ontrolƒtru™tures@A { int j a HD k a IY if @ j aa k A { kCCY } else if @ j ` k A { jCCY } else . Uz ovako deniranu enumeraciju izvedba printƒuitsngro—ti—n postaje trivijalna: st—ti™ void printƒuitsngro—ti—n@ ƒuit suit A { ƒystemFoutFprintln@ 4foj— k—rte je 4 C suitFgetgrox—me@A AY } 2. doEwhile. odgovaraju¢i (privatni!) getgrox—me.

u unutarnjoj petlji narediti izlazak iz vanjske petlje.8: Izjave ˜re—k i ™ontinue koje koriste oznake st—ti™ void ˜re—kgontinue@A { outervoopX for @ int i a IY i ` RY iCC A { for @ int j a IY j ` RY jCC A { if @ i E j aa EI A ™ontinue outervoopY if @ i 7 j aa I A ˜re—k outervoopY . Kori²tenjem oznaka (eng. label ) mogu¢e je npr.44 POGLAVLJE 2. pogotovo u kombinaciji s ugnijeºženim petljama. To je demonstrirano ovim primjerom: Ispis 2. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA k a HY GGEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE for @ int i a HY i ` SY iCC A { if @ i aa j E P A ™ontinueY j Ca iY if @ j b Q A ˜re—kY } GGEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE while @ j ` IQ A jCCY GGEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE do { kCCY } while @ k ` IQ AY GGEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE swit™h @ j A { ™—se HX kCCY ˜re—kY ™—se IX jCCY ˜re—kY def—ultX j a k E jY } } Posebnu pozornost zahtijevaju jedino naredbe za izvanredan prekid petlje (˜re—k) ili izravan pomak na sljede¢i korak petlje (™ontinue).

 £lan je dostupan iz svih klasa u istom paketu. Ova razina dostupnosti nazna£uje se klju£nom rije£i prvenstveno u klasi koja je posebno namijenjena da korisnik paketa iz nje izvodi svoje klase. Java poznaje jo² jednu razinu. koja ne postoji u jeziku.1. prote™ted. Koristi se Pristup je jo² uvijek zabranjen klasama iz drugih paketa ako nisu potklase.) klasa o o o o o o o o o o paket potklase ostali private package-private protected public . razine dostupnosti mogu se sistematizirati tablicom 2.1: Pregled razina dostupnosti razina (eng. bez obzira u kojem paketu se nalazila. ²iru od paketno-privatne  koja dodatno dozvoljava dostup iz svake potklase. Sveukupno. Dosad smo se susreli s tri razine dostupnosti: • privatna • paketno-privatna • javna  £lan je dostupan bez ograni£enja. 2. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 45 } } ƒystemFoutFprintln@ 4i a 4 C i C 4D j a 4 C j AY O£ekivani ispis je: i i i i a a a a ID PD PD QD j j j j a a a a I I P I Ove konstrukcije uvedene su u jezik Javu kao zamjena za naj£e²¢i slu£aj kori²tenja naredbe goto.POGLAVLJE 2.6 Sve razine dostupnosti  £lan je dostupan samo u klasi gdje je deniran. Tablica 2.

Argument this (vidjeti this klju£an je za funkcioniranje polimorzma i bez njega ne moºe do¢i do dinami£kog povezivanja. ve¢ samostalno. Takva metoda odgovara pojmu funkcije iz proceduralne paradigme (kao npr. ovaj kod ne¢e proizvesti prevoditeljsku pogre²ku: Ispis 2. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 2. neki atribut ozna£en kao tan za sve instance te klase i nedostupan instancama drugih klasa.1 Model klasne enkapsulacije priv—te. to zna£i da je on priva- Java koristi model enkapsulacije koji je zasnovan ne na instanci. to je ksirano u trenutku prevoženja. Drugim rije£ima.46 POGLAVLJE 2. . Na primjer. ne prosliježuje joj se implicitni argument odjeljak 2. Time se postiºe da se takva metoda ne poziva nad nekom instancom. Modikator posebnu metodu m—in. iako nije striktno u duhu paradigme objekata s nedodirljivom unutra²njosti.7 Stati£ka metoda  izuzeta od polimorzma st—ti™ ve¢ je usputno spomenut i kori²ten u ispisima koda uz Njime je mogu¢e ozna£iti i bilo koju drugu metodu. a ne uz njene instance. u jezicima C ili Pascal).9: Model klasne enkapsulacije ™l—ss e˜™ { priv—te int iY pu˜li™ void m—nipul—teenothery˜je™t@ e˜™ —nothery˜je™t A { —nothery˜je™tFiCCY } } Ovakav model. sve instance iste klase mežusobno imaju neograni£en dostup atributima i metodama. Ako je npr. u praksi je opravdan jer je sav kod koji moºe manipulirati privatnim dijelovima drugog objekta lociran na istom mjestu pa se ne mogu pojaviti problemi zbog kojih je i uvedena enkapsulacija  da kod koji koristi neki objekt prestane funkcionirati zbog izmjena na njegovim unutarnjim detaljima. Dakle. Za stati£ke metode ponekad se koristi i izraz metoda klase odnosno klasina metoda jer je vezana uz klasu.6.11). Za stati£ke metode koristi se stati£ko povezivanje  tijekom izvr²avanja ne donosi se odluka koju metodu pozvati. 2. ve¢ na klasi.

Pogre²ku treba otkloniti tako da se jasno ustanovi nad kojom instancom je metoda trebala biti pozvana i da se kod ispravi u skladu s time. Ako se stati£ka metoda poziva iz neke druge klase. a stati£ko povezivanje je ekasnije od dinami£kog. U tom slu£aju dinami£ko povezivanje ionako ne dolazi u obzir.POGLAVLJE 2. • Kad metoda ne ovisi ni o jednom parametru. problem otklanjaju progla²avanjem metode sta- ti£kom i time zapravo samo stvaraju dodatne probleme. Studenti ponekad. Ovakva primjena prikazana je u primjeru koji slijedi malo niºe. poziv se zapisuje u obliku ul—s—Fst—ti£k—wetod—: Ispis 2. • Kad su svi parametri primitivne vrste. Podru£ja primjene u praksi: • Kad su parametri metode instance tužih klasa  koje samo koristimo. a ne razvijamo pa nemamo dostup njihovom izvornom kodu i ne moºemo dodati svoju metodu. Tada jednostavno nema razloga za²to ne bi bila stati£ka. ugledaju¢i prevoditeljevu pogre²ku  snst—n™e method used in — st—ti™ ™ontext. Takva primjena zna£ajno je oteºana gubitkom dinami£kog povezivanja. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 47 U ovoj skripti ponekad ¢e se koristiti stati£ke metode.10: Poziv stati£ke metode pu˜li™ ™l—ss foole—npun™tions { pu˜li™ st—ti™ ˜oole—n implies@ ˜oole—n leftD ˜oole—n right A { return 3@ left 88 3right A Y } } pu˜li™ ™l—ss ixe™ut—˜le { pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ˜oole—n — a trueD ˜ a f—lseY ˜oole—n result a foole—npun™tionsFimplies@ —D ˜ AY ƒystemFoutFprintln@ 44 C — C 4 implies 4 C ˜ C 4c 4 C result AY } } Ispis: . u primjerima za koje dinami£ko povezivanje nije bitno.

konstanta konstanti. Postoji samo jedna. Primijetimo da je u gornjem primjeru metoda pozvana putem varijable £ija vrijednost je null. atribut isto moºe biti stati£ki i time nevezan uz instancu.8 Stati£ki atribut. bitna je samo njena vrsta. globalna vrijednost takvog atributa. £ime se jasno demonstrira da se potpuno ignorira vrijednost varijable. npr: Ispis 2.11: Poziv stati£ke metode sintaksom kao da je instancina metoda pu˜li™ ™l—ss ixe™ut—˜le { pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ˜oole—n — a trueD ˜ a f—lseY foole—npun™tions ˜f a nullY ˜oole—n result a ˜fFimplies@ —D ˜ AY ƒystemFoutFprintln@ 44 C — C 4 implies 4 C ˜ C 4c 4 C result AY } } Prevoditelj utvržuje vrstu izraza lijevo od to£ke i ta vrsta mora biti klasa u kojoj je denirana doti£na metoda. Sli£no kao metoda. mogli bismo u konstanti denirati podrazumijevanu duljinu ciklusa broja£a Ispis 2. Jedna od naj£e²¢ih uporaba stati£kih atributa je za deniranje npr. Ovaj na£in zapisa ne treba nikada koristiti jer samo zavarava.12: Stati£ki atribut. a ne donosi nikakve dodatne prednosti (nema polimorzma). 2.48 POGLAVLJE 2. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA true implies f—lsec f—lse Specikacija jezika Java [4] dozvoljava i poziv stati£ke metode istom sintaksom kao da je instancina metoda. javna konstanta wodulogounter: pu˜li™ ™l—ss wodulogounter { pu˜li™ st—ti™ fin—l int hipe…v„•wyh…v…ƒ a IHY priv—te int modulusY pu˜li™ wodulogounter@A { thisFmodulus a hipe…v„•wyh…v…ƒY } } FFF .

Za sve identikatore koristi se isklju£ivo engleski jezik. Svaka daljnja rije£ u imenu po£inje velikim slovom. Na atribute i varijable djeluje tako da zabranjuje promjenu njihove vrijednosti nakon inicijalizacije. Njime se. uhva¢ene iznimke.1 Modikator final  rekapitulacija fin—l. hipe…v„•wyh…v…ƒ. U praksi velik broj.POGLAVLJE 2. a obavezno po£inje malim slovom. Ime apstraktne klase u vrhu hijerarhije uobi£ajeno . ali vrlo snaºna pravila oblikovanja identikatora. • Ime referentne vrste podatka (klasa i su£elje) obavezno po£inje velikim slovom. od kojih se ne smije odudarati. • Ime lokalne varijable. npr. Npr. Npr.8. atributa i metode ™ounterƒt—te. Naj£vr²¢a pravila ti£u se rasporeda velikih i malih slova: • U imenu paketa zabranjeno je koristiti velika slova. 2. ako zatreba.11 Pri deniranju konstante pojavljuje se i modikator obja²njeno je kako se on primjenuje na metode i klase radi kontrole polimorzma. Npr. a moºda i ve¢ina varijabli imaju ulogu konstante. koje se pi²u velikim slovima. naj£i²¢e ime  bez posebnih preksa ili suksa  kao u na²em primjeru gounter. U odjeljku 1. Npr. Svaka daljnja rije£ u imenu ponovo po£inje velikim slovom. Za su£elje se uvijek odabire najkra¢e. To je stoga ²to se upravo ime su£elja najvi²e koristi u kodu. pu˜li™ void in™rement@ fin—l int step A { FFF } Kori²tenjem modikatora fin—l na svim varijablama gdje je to smisleno pove¢ava se £itljivost koda jer se time jasno nagla²ava da se ustvari radi o konstanti. • Poseban slu£aj su javne konstante.9 Pravila oblikovanja identikatora U jeziku Java na snazi su neformalna. moºe ozna£iti i parametar metode. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 49 2. rije£i se odvajaju podvlakom. parametra. ƒimplegounter. ime paketa kori²tenog u primjerima je hrFferFtelFjsem.

pojam da je neke druge. to bi prouzro£ilo pogre²ku jer potklasa moºe imati dodatne metode koje natklasa nema. u ipak mogla koristiti instancu potklase  dapa£e. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA je napraviti od imena su£elja s preksom e˜str—™t  npr. upcast je tehni£ko sredstvo koje omogu¢ava transparentno kori²tenje polimorzma. Njega je uvijek sigurno provesti  ne moºe se dogoditi da instanca potklase nema neku metodu deniranu za natklasu. prije svega C-u. Njega se ne koristi da bismo instancu natklase tretirali kao Downcast gounter) sluºi da bi se npr.13). kad se instanca klase ƒimplegounter tretira kao instanca su£elja gounter (u ispisu 1. cijeli broj mogu¢e je cast -ati u pokaziva£. a naprijed se dodaju rije£i koje pobliºe opisuju o kakvoj implementaciji se radi  npr. Za referentne vrste jedini dozvoljeni oblik cast anja je unutar klasne hijerarhije  ili prema gore (upcast ). U nekim drugim jezicima. Slu£aj upcast -a je jednostavniji i dogaža se automatski. ili prema dolje (downcast ).50 POGLAVLJE 2.10 Upcast i downcast type cast odnosi se na tretiranje podatka jedne vrste kao Op¢enito. Tako se naziva situacija s kojom smo se ve¢ sreli  na primjer.13: wodulogounter s dodatnom metodom setwodulus p—™k—ge hrFferFtelFjsemY pu˜li™ ™l—ss wodulogounter extends e˜str—™tgounter { priv—te int modulus a IHY pu˜li™ wodulogounter@ int initi—lƒt—te A . prema dolje po hijerar- downcast. Isto se do- gaža i kad imamo dvije klase u odnosu natklasa-potklasa. metodi koja prima op¢eniti parametar (npr. Uzmimo (ispis 1. Java dozvoljava i hiji  cast -anje u suprotnom smjeru. e˜str—™tgounter. 2. wodulogounter. puna funkcionalnost instance konkretne klase (npr. mogu¢e je cast -ati izmežu vrsta na razli£ite na£ine  na primjer. Konkretne klase uobi£ajeno zadrºavaju ime svog su£elja na zadnjem mjestu.21) ima dodatnu jer je speci£na za wodulogounter setwodulus koja nije denirana u su£elju gounter slu£aj cikli£kog broja£a: Ispis 2. konkretan primjer  recimo da klasa metodu wodulogounter). Dakle.

POGLAVLJE 2. ako imamo ovakav poziv metode usegounter: usegounter@ new ƒimplegounter@A AY .10.14: Metoda koja upravlja wodulogounter-om pu˜li™ st—ti™ void usegounter@ gounter ™ntr A { wodulogounter modgntr a @wodulogounterA ™ntrY modgntrFsetwodulus@ U AY } Varijabli vrste wodulogounter pridjeljuje se vrijednost parametra vrste gounter i stoga je potrebno eksplicitno provesti downcast izrazom @wodulogounterA ™ntr 2. ºeli postaviti duljinu ciklusa na potrebnu vrijednost: Ispis 2. U trenutku kompilacije op¢enito nije mogu¢e ustanoviti ho¢e li se to dogoditi.1 Operator instanceof downcast nad objektom koji nije instanca doti£ne U slu£aju da obavimo klase (ili eventualno njena potklasa). Na primjer. recimo da negdje imamo metodu koja prima parametar op¢enite vrste gounter. tijekom izvr²avanja programa bit ¢e prijavljena pogre²ka. ali u slu£aju da se radi o cikli£kom broja£u. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 51 { } super@ initi—lƒt—te AY pu˜li™ wodulogounter@A { } pu˜li™ void setwodulus@ int newwodulus A { thisFmodulus a newwodulusY } void setƒt—te@ int newƒt—te A { thisF™ounterƒt—te a newƒt—te 7 thisFmodulusY } } Nadalje.

Java ne¢e dozvoliti ni da kod stigne do tog poziva jer ¢e prijaviti pogre²ku ve¢ prilikom poku²aja downcast -anja. Formalno.1.52 POGLAVLJE 2. a vrijednost referenca na objekt nad kojim je metoda pozvana. zadrºavaju¢i identi£no pona²a- Ispis 2. susreli s klju£nom rije£i pomo¢u koje smo u kodu metode pristupali atributima objekta nad kojim je ona pozvana. u ve¢ini slu£ajeva gdje se radi downcast potrebna je ovakva provjera. 2.16: Implicitni parametar this pu˜li™ void in™rement@A . U praksi. prima implicitno i dodatni parametar £ije ime je this. u ispisu 1. ako je desni operand su£elje. provjerava se je li prosliježen objekt wodulogounter. tj. Operator inst—n™eof s lijeve strane op- ¢enito ima neki izraz £ija vrijednost je referentne vrste. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA jasno je da mora do¢i do pogre²ke jer klasa todu ƒimplegounter ne denira me- setwodulus. metodu in™rement iz ispisa 1.11 Implicitni parametar metode  this this Ve¢ smo se na samom po£etku. a s desne strane doslovno navedeno ime neke referentne vrste (klase ili su£elja). vrsta mu je klasa u kojoj se metoda nalazi. Prekid izvr²avanja zbog pogre²ke moºe se izbje¢i obavljanjem prethodne provjere operatorom inst—n™eof: Ispis 2. osim eksplicitno navedenih parametara.16 (deklaracija klase ƒimplegounter) nje: mogli smo zapisati i ovako. provjerava je li lijevi operand objekt koji implementira to su£elje. Odnosno. Na primjer. svaka instancina metoda (metoda objekta.15: Doražena metoda usegounter pu˜li™ st—ti™ void usegounter@ gounter ™ntr A { if @ ™ntr inst—n™eof wodulogounter A { wodulogounter modgntr a @wodulogounterA ™ntrY modgntrFsetwodulus@ U AY } } Prije nego ²to se obavi zaista instanca klase downcast. Operator vra¢a true ako je lijevi operand instanca desnog operanda ili njegove pot- klase. svaka koja nije stati£ka).

Za sve ostale.12). Na osnovu te vrste donosi se odluka koju metodu pozvati.17: Neuspio poku²aj uvoženja eksplicitnog parametra this pu˜li™ interf—™e gounter { void in™rement@AY void in™rement‡ithixpli™it„his@ gounter expli™it„his AY FFF ost—le metode FFF } pu˜li™ ™l—ss ƒimplegounter implements gounter { priv—te int ™ounterƒt—teY pu˜li™ void in™rement@A { thisF™ounterƒt—teCCY } pu˜li™ st—ti™ void in™rement‡ithixpli™it„his@ gounter expli™it„his A { expli™it„hisF™ounterƒt—teCCY . u ispisu 1.POGLAVLJE 2. Bez ovog saznanja mogli bismo pomisliti da su npr.1 Parametar this i polimorzam this je da upravo on omogu¢uje funkci- Ono ²to je najvaºnije za parametar oniranje polimorzma jer se samo za njega provodi dinami£ko povezivanje. stati£ki se ustanovljuje potpis pozvane metode vrsta se (vidjeti odjeljak 1. iz varijable ™ntrIFin™rement@A this. ova dva pristupa deniranju metode in™rement ekvivalentni (modikator st—ti™ narežuje da se ne proslijedi implicitni parametar this. Tijekom izvr²avanja programa prije svakog poziva metode prvo se provjerava to£na vrsta objekta na koji ¢e pokazivati this. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 53 { } ƒimplegounter ™ntr a thisY ™ntrF™ounterƒt—teCCY Prilikom poziva metode. npr.4. ve¢ samo prilikom prevoženja i to na osnovu deklarirane vrste izraza koji se pojavljuju kao argumenti metode.7): Ispis 2. vidjeti odjeljak 2. obi£ne parametre ne utvržuje prilikom izvr²avanja. referenca ™ntrI prepisujse se u parametar 2.11. Drugim rije£ima.

54

POGLAVLJE 2.

RAZRADA DETALJA JEZIƒNIH SVOJSTAVA

} } FFF ost—le metode FFF

Metode bismo mogli poku²ati koristiti ovako: Ispis 2.18: Neuspio poku²aj kori²tenja metode s eksplicitnim

this

pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { gounter ™ntr a new ƒimplegounter@AY ™ntrFin™rement@AY gounterFin™rement‡ithixpli™it„his@ ™ntr AY }
Naoko, situacija je ekvivalentna  prvi put se argument metode navodi lijevo od to£ke, a drugi put kao normalni argument u zagradama. Mežutim, uvoženje metode

in™rement‡ithixpli™it„his

ustvari generira £itav niz

prevoditeljevih pogre²aka, sve zbog toga ²to Java ne provodi dinami£ko povezivanje nad normalnim argumentima. Prilikom prevoženja poziva

in™rementwithixpli™it„his@ ™ntr A ™ntr
jednaka

utvržuje Tu se

se da je deklarirana (stati£ka) vrsta argumenta nigdje ne pojavljuje prava vrsta objekta,

gounter.

ƒimplegounter,

i Java uop¢e ne¢e

uzeti u obzir tu klasu. Dakle, nemogu¢e je da ¢e se pozvati metoda iz klase

ƒimplegounter.

Vrsta

gounter

je ustvari

su£elje

u kojem uop¢e nema de-

nicija metoda. Jasno je dakle da je ovakva situacija nemogu¢a i da mora uzrokovati prevoditeljevu pogre²ku. U praksi, prevoditeljeva pogre²ka pojavit ¢e se ve¢ £im metodu

in™rementwithixpli™it„his

ozna£imo kao

st—ti™

jer je to metoda su£elja, a metode su£elja nikad nisu stati£ke  iz upravo obja²njenog razloga. Nadalje, £ak i da se svi ovi problemi na neki neobja²njeni na£in rije²e i da zaista bude pozvana metoda

in™rementwithixpli™it„his

u klasi

ƒimplegounter, tamo stoji izjava expli™it„hisF™ounterƒt—teCC. Parametar exE pli™it„his
je vrste

gounter,

a u toj vrsti ne spominje se nikakav atribut

™ounterƒt—te

i stoga ¢e se i za to prijaviti prevoditeljeva pogre²ka.

Jo² jedan primjer u kojem se o£ituje razlika izmežu parametra ostalih moºe se vidjeti u raspravi u odjeljku 3.2.1.

this

i

Pojam koji se u struci koristi za proces dinami£kog povezivanja je

hod dispatch.

Za Javu se stoga kaºe da podrºava samo

metsingle dispatch jer

POGLAVLJE 2.

RAZRADA DETALJA JEZIƒNIH SVOJSTAVA

55

obavlja

dispatch po multiple dispatch.

samo jednom parametru metode. Suprotan pojam je

Stru£ni pojam za jezi£no svojstvo da se prilikom prevoženja, tj. stati£ki

static typing. jezik. Suprotan pojam je dynamic typing.
utvržuju vrste svih izraza je

Java je, dakle,

statically typed

2.12
2.12.1

Detalji o hijerarhiji klasa
Korijenska klasa Object
j—v—Fl—ngFy˜je™t,

U 1. poglavlju ve¢ se govorilo o izvedenim klasama. U Javi je svaka klasa izvedena iz to£no jedne klase, osim posebne ugražene klase

koja nema natklasu. Ako nacrtamo detaljan UML-ov dijagram klasa prikazuju¢i sve veze izvedena iz, dobit ¢emo

stablo £iji korijen je klasa j—v—Fl—ngFy˜je™t.
Klasa

Ako deklaracija klase ne navodi eksplicitno iz koje je klase izvedena, podrazumijeva se  extends

j—v—Fl—ngFy˜je™t.

y˜je™t

denira i neke metode

koje stoga imaju svi objekti (vidjeti 3.2). Graf odnosa implementira su£elje s druge strane, jest hijerarhija, ali nije stablo. Jedna klasa moºe implementirati proizvoljan broj su£elja, a i su£elje moºe biti izvedeno iz proizvoljnog broja drugih su£elja.

2.12.2

Denicije izraza vezanih uz hijerarhiju
natklasa i potklasa.
Vrijede sljede¢e de-

Kad se pri£a o hijerarhijskim odnosima izmežu klasa, treba imati na umu to£na zna£enja izraza kao ²to su nicije:

• Natklasa
e

klase

g

je klasa

f

iz koje je ona izvedena, ali takožer i klasa

iz koje je izvedena

f,

itd. Koriste¢i izraze iz genealogije,

natklasa

odgovara pojmu

pretka. Klasa y˜je™t je, dakle, natklasa svim ostalim potomak,

Javinim klasama.

• Potklasa
kojoj je

klase

e

je, analogno, svaka klasa-

tj. svaka klasa

f

e

natklasa.

Klasadena.

roditelj

klase

g

je njena

izravna natklasa 

ona iz koje je izve-

56

POGLAVLJE 2.

RAZRADA DETALJA JEZIƒNIH SVOJSTAVA

Klasaklasa

dijete

klase

g

je svaka klasa koja je iz nje izvedena, tj. kojoj je

g

roditelj.

2.12.3

Ulan£avanje poziva konstruktora

Svaki konstruktor, prije nego ²to se izvr²i njegov kod, duºan je prvo pozvati neki konstruktor svoje natklase. To se dogaža ili eksplicitno, kori²tenjem klju£ne rije£i

super,

ili, u odsustvu toga, implicitno se dodaje poziv po-

drazumijevanog konstruktora natklase (super@A). Posljedica toga je da se konstruktori izvr²avaju tor klase

ulan£ano,

tako da se prvo uvijek izvr²i konstruk-

y˜je™t,

zatim kontruktor neke njene izravne potklase, itd. sve do

konkretne klase koja se instancira. Zbog toga £ak i za apstraktne klase, koje se ne smiju instancirati, vrijede ista pravila o posjedovanju bar jednog konstruktora. Bez toga bi bilo nemogu¢e instancirati njihove potklase. Imaju¢i re£eno u vidu, moºemo uvidjeti da je puni oblik dvaju konstruktora u ispisu 1.20 ustvari ovakav: Ispis 2.19: Eksplicitan poziv konstruktora natklase

pu˜li™ e˜str—™tgounter@ int initi—lƒt—te A { super@AY setƒt—te@ initi—lƒt—te AY } pu˜li™ e˜str—™tgounter@A { super@AY }
Implicitne pozive treba uvijek imati na umu, posebice stoga ²to natklasa

ne mora

posjedovati podrazumijevani konstruktor. Ako dakle imamo kons-

truktor s izostavljenim pozivom konstruktora natklase, a natklasa nema podrazumijevani konstruktor, do¢i ¢e do pogre²ke prilikom prevoženja koja moºe biti prili£no zbunjuju¢a jer se dogodila u praznom prostoru u koji je implicitno dodan izostavljeni poziv

super@A.

Konstruktor moºe umjesto iz natklase pozvati i neki drugi konstruktor iz iste klase. Time je omogu¢ena vi²estruka iskoristivost koda u vi²e konstruktora. U kona£nici, nakon ²to se konstruktori klase mežusobno dogovore koji ¢e se prvi izvr²iti, taj konstruktor opet poziva konstruktor iz

a izvr²ava na bilo kojem stroju koji ima implementaciju JVM-a. konstruktore u ispisu 1. u izvr²ni kod koji se izravno moºe izvr²avati na procesoru ra£unala. £iji temelj je Javin virtualni stroj. nego i cjelokupna softverska platforma. Poziv susjednog konstruktora postiºe se kori²tenjem klju£ne rije£i this umjesto super. zatim ostatak konstruktora s jednim parametrom.20: Poziv konstruktora iste klase pu˜li™ e˜str—™tgounter@ int initi—lƒt—te A { super@AY setƒt—te@ initi—lƒt—te AY } pu˜li™ e˜str—™tgounter@A { this@ H AY } Kori²tenjem podrazumijevanog konstruktora e˜str—™tgounter@A prvo ¢e se izvr²iti podrazumijevani konstruktor natklase (super@A).POGLAVLJE 2. bytecode ). 2. Radi se samo o ²tednji na klju£nim rije£ima njihovim vi²estrukim kori²tenjem u jeziku. Programi napisani u Javi ne prevode se. Napomenimo na kraju da kori²tenje klju£nih rije£i super i this za po- zive konstruktora nema nikakve veze s kori²tenjem istih klju£nih rije£i u smislu reference na trenutni objekt i pozivanja metode natklase. a zatim ostatak podrazumijevanog konstruktora (u ovom slu£aju nema daljnjih akcija u njemu). metode itd. Takožer se tehni£ki omogu¢uje i bolja kontrola nad interakcijom izmežu Javinog . Na primjer. ve¢ u posebnu vrstu izvr²nog koda za Javin virtualni stroj (JVM). Taj poseban binarni kod naziva se ili mežukodom byte -kodom (eng.13 Java kao softverska platforma Pod pojmom Java ne podrazumijeva se samo programski jezik i njegova biblioteka klasa. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA 57 natklase. koji onda konkretno ra£unalo emulira. kao ²to je ina£e uobi£ajeno. Svaka dodatna klju£na rije£ zna£i jo² jedan zabranjeni identikator za varijable.20 mogli smo denirati i ovako: Ispis 2. bez obzira na vrstu procesora. Cilj toga je postizanje neovisnosti o ra£u- nalskoj platformi: kod se kompilira jednom.

58 POGLAVLJE 2. RAZRADA DETALJA JEZIƒNIH SVOJSTAVA programa i ra£unala na kojem se izvr²ava. Lak²e je mogu¢e blokirati svaki poku²aj pristupa osjetljivim resursima i tako onemogu¢iti zlonamjerni kod. U mežuvremenu se Java po£ela masovno koristiti i za pisanje obi£nih. kao i Borlandov JBuilder. embedded appli- cations. otvara se prostor za napade na ra£unalo pisanjem zlonamjernog koda. Na primjer. . ƒim se ne²to implicitno u£itava putem Weba. samostojnih aplikacija. aplikacije koje se u£itavaju unutar webskih stranica. Vi²e o ovome moºe se doznati na [5]. napisani su u Javi. gdje je pitanje sigurnosti manje bitno. £itavo razvojno okruºje Eclipse. Sve ovo potje£e od prvotnog cilja Jave da sluºi za tzv.

Na primjer. a zatim slijedi popis £lanova  konstruktora. npr. 3. 59 . Na slici 3. U tom okviru zatim moºemo na¢i klasu koja nas zanima. nalazi se Javadoc -ova do- Javin sustav za HTML-ovsku dokumentaciju zove se na upravo spomenutoj internetskoj lokaciji. Kad otvorimo tu lokaciju u pregledniku Weba. y˜je™t. dobit ¢emo prikaz kao na slici 3. Pregled treba zapo£eti u okviru gore lijevo.1. Takožer je istaknut i jedan od ugraženih paketa koji je posebno usko povezan s jezikom  paket j—v—Fl—ng.1 Uvodne upute za snalaºenje u Javinoj dokumentaciji API-ja Javadoc.Poglavlje 3 Najvaºnije ugražene klase Ve¢ je re£eno da jezik Java sadrºi i ve¢i broj ugraženih klasa i su£elja. Treba kliknuti na paket od interesa. gdje je njegov detaljan opis. Time se u okviru dolje lijevo suºava izbor i prikazuju se samo klase iz doti£nog paketa.2 prikazana je detaljna dokumentacija za metodu equ—ls. Prvo su u tablicama pobrojani svi £lanovi s kratkom napomenom. [1]. kumentacija cjelokupne Javine biblioteke klasa. atributa i metoda. Na vrhu je op¢eniti opis klase. u ovom slu£aju j—v—Fl—ng. Za daljnje detalje treba se obratiti dokumentaciji Javine biblioteke klasa dostupne na Webu [1]. Tamo je popis svih paketa. U glavnom okviru (desno) pojavljuje se dokumentacija traºene klase. Klikom na ime £lana odlazi se dublje u stranicu. Ovdje ¢e biti izloºeni detalji nekoliko najvaº- nijih klasa iz tog paketa.

1: Po£etna stranica Javadoc-a . NAJVAšNIJE UGRAÐENE KLASE Slika 3.60 POGLAVLJE 3.

NAJVAšNIJE UGRAÐENE KLASE 61 Slika 3.2: Dokumentacija za metodu equ—ls .POGLAVLJE 3.

To nije  kao ²to bi se moglo pomisliti za najop¢enitiju klasu koja predstavlja bilo kakav objekt  samo prazna. Budu¢i da je parametar vrste y˜je™t. Ako je potrebna smislena usporedba objekata neke klase. prvo ¢e biti potrebno ustanoviti je li prosliježeni objekt odgovaraju¢e vrste  jer ako nije. Me- equ—ls denirana je u klasi y˜je™t.lang. kao ²to je napomenuto u odjeljku 2. onda je jasno da nije jednak trenutnom objektu. iza £ega slijedi odgovaraju¢i downcast.62 POGLAVLJE 3. Stoga kod ove metode rutinski zapo£inje kori²tenjem operatora inst—n™eof. Metodu se koristi tako da ju se pozove nad prvim U odjeljku 2. Potpis metode je equ—ls@ y˜je™t A i upravo takvu metodu moramo dodati u svoju klasu.1.Object y˜je™t je u korijenu Javine hijerarhije klasa.2 Klasa Klasa java.2 spomenuto je da za provjeru jednakosti objekata treba koristiti metodu objektom i kao argument se proslijedi drugi objekt: toda oIFequ—ls@ oP A. Na primjer. Ovdje ¢e se detaljnije govoriti o toj klasi. Ovdje ¢e se od svega spominjati samo njene najosnovnije karakteristike. 3.21): Ispis 3. potrebno je nadja£ati ovu metodu odgovaraju¢om implementacijom.2. Radi se o konkretnoj klasi koju je mogu¢e normalno instancirati.1: Implementacija metode equ—ls p—™k—ge hrFferFtelFjsemY pu˜li™ fin—l ™l—ss ƒimplegounter extends e˜str—™tgounter { FFF sve isto k—o r—nije FFF pu˜li™ ˜oole—n equ—ls@ y˜je™t o A { if @ 3@ o inst—n™eof ƒimplegounter A A return f—lseY ƒimplegounter th—t a @ƒimplegounterA oY .1 Metoda equals equ—ls. apstraktna klasa bez svojih funkcionalnosti. ali na trivijalan na£in  usporežuju se reference (oI aa oP). Osim toga je i prili£no kompleksna i njena implementacija je vezana uz £itav niz programskih tehnika. NAJVAšNIJE UGRAÐENE KLASE 3.12.1. mogli bismo imati ovakav equ—ls u klasi ƒimplegounter (ispis 1.

NAJVAšNIJE UGRAÐENE KLASE 63 } } return thisF™ounterƒt—te aa th—tF™ounterƒt—teY Za metodu equ—ls tipi£no je da se okori²tava klasnom enkapsulacijom i da izravno pristupa atributima drugog objekta. koja je ostala nenadja£ana.POGLAVLJE 3. ve¢ o deniranju nove metode koja samo preoptere¢uje ime equ—ls. Razlog za ovakvo pona²anje. Sljede¢i primjer pokazuje u kojem slu£aju ¢e raditi. U jednostavnim primjerima kod ¢e £ak ispravno raditi jer ¢e se pozivati ta metoda umjesto prave metode equ—ls. zna£i da je pozvana originalna metoda equ—ls y˜je™t. Pa- y˜je™t. Jedna od tipi£nih pogre²aka kod studenata je deklaracija metode s parametrom £ija vrsta je trenutna klasa (npr.2: Tipi£na pogre²ka s preoptere¢enjem umjesto nadja£avanjem pu˜li™ ™l—ss iqu—ls„ester { pu˜li™ ˜oole—n equ—ls@ iqu—ls„ester et A { return trueY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { iqu—ls„ester etI a new iqu—ls„ester@AY iqu—ls„ester etP a new iqu—ls„ester@AY ˜oole—n ˜Y ˜ a etIFequ—ls@ etP AY ƒystemFoutFprintln@ ˜ AY GG true GG up™—st —rgument— n— vrstu y˜je™tX y˜je™t oP a etPY ˜ a etIFequ—ls@ oP AY ƒystemFoutFprintln@ ˜ AY GG f—lse3 GG up™—st o˜jekt— n—d kojim se poziv— metod—X y˜je™t oI a etIY ˜ a oIFequ—ls@ etP AY ƒystemFoutFprintln@ ˜ AY GG f—lse3 } } Kad god se ispi²e iz klase f—lse. koje se nekima moºe £initi nelogi£nim s obzirom na postojanje dinami£kog . u protivnom se ne¢e raditi o nadja£ava- nju. rametar mora biti vrste equ—ls@ ƒimplegounter A). a u kojima ne: Ispis 3.

Problem kao u drugom slu£aju dogaža se uvijek kad se metoda preoptere¢uje tako da su vrste parametara u odnosu potklasa-natklasa. trebaju imati razli£ita imena. U Javu ugražene kolekcije u (vidjeti 5. Vrste argumenata. potpis pozvane metode utvržuje se stati£ki. je u tome ²to se dinami£ko povezivanje provodi samo nad parametrom this. Argument je ponovo vrste kao u prvom slu£aju. 3. £esto kori²tena klasa r—shƒet). One se oslanjaju na ispravnu implementaciju metode h—shgode svakom objektu koji se sprema u kolekciju. NAJVAšNIJE UGRAÐENE KLASE povezivanja. iqu—ls„ester  Tre¢i slu£aj je najsuptilniji. To je struktura koja sluºi za memorijski ekasno spremanje ve¢e koli£ine podataka uz sposobnost brzog dohva¢anja podatka prema njegovom klju£u  he²-kodu. da he²-kodovi budu ²to bolje raspr²eni po objektima. koji je radio ispravno.2 (eng. Na osnovu toga odabire equ—ls@ y˜je™t A. prilikom prevoženja. U protivnom ¢e se degradirati ekasnost he²-tablice. Metoda hashCode ili Ova metoda vezana je uz vrlo zna£ajnu programsku tehniku  he²-tablicu hash table hashtable ). U prvom pozivu. s parametrom vrste se potpis metode y˜je™t. tj.11). Bitno je i da dva razli£ita objekta ²to £e²¢e vra¢aju razli£it he²-kod  dakle. Jasno je . tj.2. Ako postoji potreba za takve dvije metode. Presudno je da dva jednaka objekta uvijek prijavljuju i jednak he²-kod. Problem kao u tre¢em slu£aju ne bi se dogodio da su obje verzije preoptere¢ene metode bile denirane u istoj klasi. Ova metoda usko je povezana s metodom Metoda equ—ls i njih dvije se uvijek nadja£ava u paru. zaduºena je da za svaki objekt vrati njegov he²-kod h—shgode u obliku cijelog broja (int-a). Prevoditelj u toj klasi traºi sve metode imena equ—ls i nalazi samo jednu. potpis metode je etIFequ—ls@ etP A utvrženi equ—ls@ iqu—ls„ester A equ—ls@ y˜je™t A pa se poziva na²a metoda.64 POGLAVLJE 3. Tek tijekom izvr²avanja uo£it ¢e se da je stvarna vrsta objekta lijevo od to£ke iqu—ls„ester. nad objektom lijevo od to£ke u pozivu metode (vidjeti odjeljak 2. mežutim tada je ve¢ ksiran potpis metode koju treba pozvati. poglavlje) interno koriste he²-tablice (npr. Takvo preoptere¢enje redovito treba izbjegavati. U dru- gom slu£aju ispada klase pa se poziva metoda nasliježena od y˜je™t. i to je nasliježena iz klase equ—ls@ y˜je™t A  metoda y˜je™t. sada je izraz lijevo od to£ke vrste y˜je™t. Mežutim.

3.POGLAVLJE 3. NAJVAšNIJE UGRAÐENE KLASE 65 da objekt koji ima vi²e od 232 mogu¢ih stanja ne moºe za svako stanje prijaviti razli£it he²-kod i stoga je potrebno promi²ljeno implementirati ovu metodu da se postigne dobro raspr²enje.3: Predloºak za generiranje he²-koda pu˜li™ ™l—ss r—shgodeix—mple { priv—te ˜oole—n ˜ool†—lY priv—te ˜yte ˜yte†—lY priv—te ™h—r ™h—r†—lY priv—te short short†—lY priv—te int int†—lY priv—te long long†—lY priv—te flo—t flo—t†—lY priv—te dou˜le dou˜le†—lY priv—te y˜je™t o˜j†—lY priv—te int‘“ interr—y a { ID PD Q }Y pu˜li™ int h—shgode@A { int h™ a IUY h™ a QUBh™ C @ ˜ool†—lc I X H AY h™ a QUBh™ C ˜yte†—lY h™ a QUBh™ C ™h—r†—lY h™ a QUBh™ C short†—lY h™ a QUBh™ C int†—lY h™ a QUBh™ C @intA @ long†—l ” @ long†—l bbb QP A AY h™ a QUBh™ C plo—tFflo—t„osntfits@ flo—t†—l AY long d˜l„ovong a hou˜leFdou˜le„ovongfits@ dou˜le†—l AY h™ a QUBh™ C @intA @ d˜l„ovong ” @ d˜l„ovong bbb QP A AY . Deklariramo cjelobrojnu varijablu (u primjeru: na 17. U varijablu h™) i inicijaliziramo ju equ—ls izra£unamo njegov h™ ugražujemo pojedini he²-kod atributa prema formuli h™ a QUBh™ C he²-kod 4. postupak je sljede¢i: 1. U ispisu 3. Ukratko.3 prikazana je klasa koja sadrºi sve mogu¢e slu£ajeve vrsta podataka i na£in izra£una njihovog he²-koda. Postoji standardni predloºak za implementaciju ove metode i najbolje ga se uvijek drºati. Za svaki atribut koji sudjeluje u metodi he²-kod kao u primjeru. Kona£nu vrijednost varijable h™ vratimo kao ukupan he²-kod objekta. 2. Ispis 3.

Pazite da izbjegnete takvu pogre²ku.2. NAJVAšNIJE UGRAÐENE KLASE h™ a QUBh™ C o˜j†—lFh—shgode@AY for @ int i a HY i ` interr—yFlengthY iCC A h™ a QUBh™ C interr—y‘i“Y } return h™Y } 3.3 Klasa java. Takožer. znakovni nizovi predstavljeni su instancama ugražene klase Ova klasa integrirana je u sam jezik i postoje jezi£ne konstrukcije posebno . £esto je potreban ispis trenutnog stanja klju£nih objekata prije i nakon neke operacije.lang. u trenutku kad dože do pogre²ke iznimno je korisno dobiti izvje²taj o stanju objekta koji je izazvao pogre²ku. U Javi. Za ovakve i druge namjene postoji metoda toƒtring koju imaju svi objekti jer je denirana u klasi y˜je™t.66 POGLAVLJE 3. posebice tijekom traºenja i uklanjanja pogre²aka. Primjer implementacije u klasi ƒimplegounter (ispis 1. program mora ispisivati detalje tijeka izvr²avanja.21): Ispis 3. Na primjer. Metoda je zaduºena da vrati znakovni niz koji opisuje objekt. stoga ju je redovito potrebno nadja£ati smislenom implementacijom.String ƒtring. Studenti ponekad krivo shvate namjenu metode pa ju izvedu tako da sama ispisuje na zaslon. Izvorna implementacija u klasi y˜je™t prili£no je beskorisna (vra¢a ime klase £ija je instanca u pitanju i njen he²-kod u heksadecimalnom zapisu).3 Metoda toString Pri razvoju programa.4: Implementacija metode toƒtring p—™k—ge hrFferFtelFjsemY pu˜li™ fin—l ™l—ss ƒimplegounter extends e˜str—™tgounter { FFF sve isto k—o r—nije FFF pu˜li™ ƒtring toƒtring@A { return 4ƒimplegounterX4 C thisF™ounterƒt—teY } } 3.

kao i ina£e.1 Provjera jednakosti znakovnih nizova nije na sli£an na£in elegantno integrirano u jezik i Usporeživanje nizova mora ih se usporeživati kao i ostale objekte. ali se sasvim nepotrebno stvara objekt vi²ka  sam niz pod navodnicima je jedan objekt. Rezultat je novi U skladu s ovime deniran je i sloºeni koristi se dakle i za zbrajanje i za ulan- ƒtring sadrºaja 4zn—kovni niz4. 4zn—kovni4 C 4 4 C 4niz4. • Operator ulan£avanja. Ako se to dogodi. Us- aa samo ¢e usporediti reference. npr. Odluka o tome koji je smisao danog znaka donosi se prema vrsti lijevog operanda: ako je to ƒtring. operacija je ulan£avanje. NAJVAšNIJE UGRAÐENE KLASE 67 za nju: • Doslovno navoženje niza unutar dvostrukih navodnika.5: Posljedice pogre²nog kori²tenja aa za usporedbu ƒtring-ova .POGLAVLJE 3. Ca. 4zn—kovni niz4. dakle. rezultat izraza 4—4 C P C Q je 4—PQ4. npr. ako se radi o nul-referenci. rezultat izraza P C Q C 4—4 je prevoditeljeva pogre²ka jer se u ovom slu£aju radi o zbrajanju. pozivom metode poredba pomo¢u equ—ls. a ponekad neispravno. Ako se radi o objektu. a dodatni se stvara operatorom new. Kori²tenje pogre²nog na£ina usporedbe moºe izazvati vrlo neobi£no pona²anje  ponekad ispravno. a i ƒtring. U sloºenijim izrazima ne mora biti sasvim o£ito ²to je lijevi operand pa treba biti na oprezu (npr. Ovo dodu²e radi. Znakovne nizove. Znak operator dodjele C £avanje. Ako se kao operand ulan£avanja pojavi ne²to drugo osim u odgovaraju¢i toda ƒtring-a. pretvara se u niz primitivni podaci se pretvaraju na smisleni na£in. Rezultat ovog izraza je instanca klase ƒtring s navedenim teks- tom kao sadrºajem. Iz ovakve situacije moºemo se izvu¢i malim trikom: 44 C P C Q C 4—4 ¢e dati ºeljeni rezultat 4PQ—4. vrste ƒtring). ne kreira se uobi£aje- nim konstruktorom: new ƒtring@4zn—kovni niz4A. provjera pomo¢u aa ¢e pro¢i: Ispis 3. poziva se njegova me- toƒtring. automatski se pretvara 4null4. To je stoga ²to Java automatski optimizira kori²tenje instanci ƒtring-a pa moºe vi²estruko iskoristiti istu instancu na vi²e mjesta gdje se pojavljuje isti niz. ²to je lijevi operand drugog plusa u izrazu 4—4 C P C Q? to je izraz 4—4 C P.3. S druge strane. Primjerice. 3. a nizove se ne moºe pribrajati brojevima.

kreira se novi objekt pa referenca na njega vi²e nije ista. ƒtringfuffer. 3.2 Klasa Nepromjenjivost instanci String-a (eng. Budu¢i da su ƒtring-ovi nepromjenjivi. jasno je da se pri svakoj provarijable stvara novi objekt. izraz mjeni vrijednosti neke ƒtring-ovske s Ca 4tri4 ne¢e izmijeniti postoje¢i objekt pridijeljen varijabli s. Npr. kad taj isti niz sastavimo ulan£avanjem iz druga dva. koja . nema opasnosti da ¢e ga ona izmijeniti i tako neizravno i nepredviženo utjecati na funkciju pozivaju¢e metode. • U vi²enitnom programu nema potrebe za sinkronizacijom pristupa nepromjenjivom objektu iz vi²e niti. Takvi objekti imaju neka korisna svojstva koja ina£e imaju podaci primitivne vrste: • Ako se takav objekt proslijedi metodi. moºemo radi ²tednje radne memorije pribje¢i kori²tenju druge klase. Mežutim.68 POGLAVLJE 3. NAJVAšNIJE UGRAÐENE KLASE pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒtring — a 4—4Y ƒtring ˜ a 4˜4Y ƒtring —˜I a 4—˜4Y ƒtring —˜P a 4—˜4Y ƒtring —˜Q a — C ˜Y ƒystemFoutFprintln@ —˜I aa —˜P AY GG true ƒystemFoutFprintln@ —˜I aa —˜Q AY GG f—lse ƒystemFoutFprintln@ —˜IFequ—ls@ —˜P A AY GG true ƒystemFoutFprintln@ —˜IFequ—ls@ —˜Q A AY GG true } U primjeru je konstanta 4—˜4 uspje²no iskori²tena dvaput  i za —˜I i za —˜P. Ako u kodu imamo situaciju gdje se dogažaju brojne izmjene znakovnih nizova. • Ako je neki od atributa objekta nepromjenjiv objekt.3. Ovo svojstvo uvijek je izrazito poºeljno za svaku klasu gdje je to mogu¢e. moºe ga se dati na raspolaganje vanjskom svijetu bez opasnosti da ga se izvana izmijeni i tako neizravno utje£e na stanje objekta koji ga sadrºi. ƒtring dizajnirana je da bude nepromjenjiva immutable )  njene instance nikad ne mijenjaju stanje. ve¢ ¢e stvoriti novi i referencu na njega zapisati u varijablu.

Vidjeti 7. Kod ²ava na redovan na£in. Prosliježeni broj je H zna£i da program zavr- statusni kod s kojim program zavr²ava. kao npr.4 Klasa System Ova klasa ne sluºi za instanciranje. u Javinu biblioteku klasa ugražene su posebne klase £ije instance predstavljaju podatke primitivnih vrsta. autoboxing Java razlikuje primitivne od referentnih vrsta podataka i stoga brojevi. ve¢ sadrºi korisne stati£ke metode i atribute koji ostvaruju vezu s uslugama ra£unalske platforme na kojoj se izvr²ava Javin program. kolekcije podataka (vidjeti poglavlje 5). Pregled najvaºnijih £lanova klase: • atributi in. Uobi£ajeno je npr. logi£ke vrijednosti i znakovi nisu objekti.3 • • metoda metoda ™urrent„imewillis: trenutno sistemsko vrijeme exit@ int A: prekid izvr²avanja programa. ostali kodovi signaliziraju neku vrstu pogre²ke. izlaz i izlaz za pogre²ke. 2. koristiti kod EI ako se prekida zbog pogre²ke. mežutim. • metoda getenv: dohva¢anje sistemskih varijabli ( environment vari- ables ) • metoda —rr—ygopy: ekasno kopiranje sadrºaja iz jednog polja u drugo Detalje o ovim i drugim £lanovima klase treba potraºiti u dokumentaciji [1]. rade isklju£ivo s objektima. Mežutim.POGLAVLJE 3. Da bi se ipak u takvim slu£ajevima moglo baratati i njima. NAJVAšNIJE UGRAÐENE KLASE 69 modelira promjenjivi niz. Radi se o sljede¢im klasama u paketu j—v—Fl—ng: 1. U tom slu£aju. 3.5 Klase-omota£i primitivnih vrsta. mnoga programska rje²enja. ne¢emo se mo¢i koristiti elegantnim jezi£nim konstrukcijama kao kad radimo sa ƒtring-om. foole—n fyte . out i err: veza na standardni ulaz. 3.

2). 4. ako negdje moramo koristiti objekte. 8. Primjeri: int i a sntegerFp—rsesnt@ 4EP4 AY dou˜le d a hou˜leFp—rsehou˜le@ 4PFHPIeEP4 AY ˜oole—n ˜ a foole—nFp—rsefoole—n@ 4true4 AY O£ekivani ispis: i a EPD d a HFHPHPID ˜ a true . ²to dodatno olak²ava njihovo tretiranje kao da su podaci primitivne vrste (vidjeti odjeljak 3. moºemo koristiti omota£ snteger na sljede¢i na£in: int i a IY snteger inty˜j a iY GG omot—v—nje u o˜jekt FFF r—dimo ne²to s omot—nom vrijednosti FFF int j a inty˜jY GG r—zmot—v—nje n—tr—g u primitivnu vrijednost snteger inty˜jP a i C IY int k a inty˜j C inty˜jPY Java dozvoljava implicitnu konverziju izmežu primitivnih vrijednosti i njihovih omota£a u izrazu dodjele vrijednosti. gh—r—™ter ƒhort snteger vong plo—t hou˜le Jedna instanca predstavlja jednu vrijednost. Dozvoljeno je i izvoditi ra£unske operacije nad omo- ta£ima.3. Na primjer. Instance su nepromjenjive. 7. 6. 3. 5. kao ²to se vidi u posljednjem retku primjera.6 Konverzija izmežu podatka i njegovog znakovnog zapisa Klase omota£a primitivnih vrsta sadrºe i stati£ke metode koje parsiraju znakovne zapise vrijednosti.70 POGLAVLJE 3. To jezi£no svojstvo naziva se autoboxing/unboxing. a podatak kojim trebamo baratati je vrste int. NAJVAšNIJE UGRAÐENE KLASE 3.

iz primitivne vrijednosti u znakovni niz. Jedna je memorijski ekonomi£nija. NAJVAšNIJE UGRAÐENE KLASE 71 Konverzija u suprotnom smjeru. ali druga ima elegantniji zapis: dou˜le d a PFHPY ƒtring sI a ƒtringFv—lueyf@ d AY ƒtring sP a 44 C dY U drugom retku koristi se stati£ka metoda ƒtringFv—lueyf. U tre¢em retku koristi se ve¢ prikazano svojstvo operacije ulan£avanja (u odjeljku 3. . moºe se obaviti na dva na£ina.3) da automatski pretvara sve primitivne podatke u nizove. Metoda je preoptere¢ena i ima verziju za svaku primitivnu vrstu podataka.POGLAVLJE 3.

.

provjeriti da je ciklus brojanja prosliježen metodi Ispis 4.13) bit ¢e potrebno npr. Na primjer.Poglavlje 4 Iznimke U prakti£ki svakom programu dobar dio koda posve¢en je provjeri ispravnosti neke situacije i prijavljivanju pogre²aka ako se uo£i nepravilnost. tipi£no je provjeriti je li prosliježeni cijeli broj u potrebnom opsegu.1: setwodulus pozitivan broj: wodulogounter s provjerom parametra p—™k—ge hrFferFtelFjsemY pu˜li™ ™l—ss wodulogounter extends e˜str—™tgounter { priv—te int modulus a IHY pu˜li™ wodulogounter@ int initi—lƒt—te A { super@ initi—lƒt—te AY } pu˜li™ wodulogounter@A { } pu˜li™ void setwodulus@ int newwodulus A { if @ newwodulus ` H A ƒystemFoutFprintln@ 4xeg—tiv—n ™iklus ˜roj—nj—34 AY else thisFmodulus a newwodulusY } void setƒt—te@ int newƒt—te A { 73 . U na²em slu£aju broja£a (ispis 2.

ina£e se obavlja zatraºena akcija. gledaju¢i ispis. u stvarnosti ovo je prili£no neupotrebljivo. to zna£i da za svaki pojedini poziv bilo koje metode koja bi se mogla neuspje²no izvr²iti treba imati po jedan blok if za provjeru. Program ¢e nastaviti dalje i. 4. Dodatni je problem ²to se sad povratna vrijednost ne moºe koristiti za regularne namjene  mnoge metode nisu lako preurediti da vra¢aju void pa da ih moºemo int. Programer. raditi neispravno. Tijekom izvr²avanja ta me- toda se pozvala tko zna koliko puta i s kojih sve lokacija. IZNIMKE } } thisF™ounterƒt—te a newƒt—te 7 thisFmodulusY Na prvi pogled ovo moºe izgledati kao savr²eno rje²enje  ako je broj krivi. Pozivaju¢a metoda uop¢e ne¢e imati informaciju o tome je li naredba za postavljanje ciklusa uspje²no izvr²ena. Malo bolji pristup. Gornja metoda setwodulus u Javi bi se izvela ovako: pu˜li™ ™l—ss wodulogounter { FFF pu˜li™ void setwodulus@ int newwodulus A { if @ newwodulus ` H A throw new slleg—lergumentix™eption@ 4xeg—tiv—n ™iklus ˜roj—nj—4 AY } } thisFmodulus a newwodulusY FFF . Svaka pozivaju¢a metoda tada moºe provjeriti je li sve dobro zavr²ilo. ispisuje se pogre²ka. je da metoda ne bude void. naravno. Ovaj na£in opet ima niz mana  npr. koji se npr.1 Bacanje iznimke  prijava iznimne situacije U jeziku Java za rje²avanje ovih problema postoji poseban mehanizam  iznimke. nego int i da broj koji vra¢a ovisi o uspje²nosti izvr²enja. koristi u jeziku C. mo¢i ¢e samo ustanoviti da je u jednom trenutku metoda setwodulus pozvana s pogre²nom vrijedno²¢u. Mežutim.74 POGLAVLJE 4.

POGLAVLJE 4.IllegalArgumentException: Negativan ciklus brojanja . Ako dakle imamo ovakav slu£aj: Ispis 4. Ako tamo nema nikakvog koda speci£nog za baratanje iznimkama. Bacanjem iznimke prekida se izvr²avanje metode i ona. u ovom slu£aju ne¢e ju vratiti. nego ¢e se u pozivaju¢oj metodi pojaviti ta ba£ena iznimka kao rezultat metode.3: Izvje²taj o ba£enoj iznimci Exception in thread "main" java. dogodit ¢e se ne²to prili£no neo£ekivano: izvr²avanje te pozivaju¢e metode takožer ¢e odmah biti prekinuto i ona ¢e ponovo baciti tu istu iznimku svojoj pozivaju¢oj metodi.lang.2: Bacanje i ponovno bacanje iznimke pu˜li™ ™l—ss wodulogounter { FFF pu˜li™ void setwodulus@ int newwodulus A { if @ newwodulus ` H A throw new slleg—lergumentix™eption@ 4xeg—tiv—n ™iklus ˜roj—nj—4 AY } } thisFmodulus a newwodulusY FFF pu˜li™ ™l—ss epp„h—t…ses„hegounter { priv—te st—ti™ ˜oole—n intermedi—tewethod@ int i A { wodulogounter m™ a new wodulogounter@AY m™Fsetwodulus@ i AY ƒystemFoutFprintln@ 4intermedi—tewethod uspje²no z—vr²—v—4 AY return trueY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ˜oole—n ˜ a intermedi—tewethod@ EI AY ƒystemFoutFprintln@ 4intermedi—tewethod je vr—til— 4 C ˜ AY } } pokretanje programa rezultirat ¢e sljede¢im ispisom: Ispis 4. ako je i trebala vratiti neku povratnu vrijednost. Ovo je sasvim nov i neobi£an pojam i trebat ¢e malo vi²e vremena da legne po£etniku. IZNIMKE 75 Primje¢ujemo klju£nu rije£ throw: njome se baca iznimku.

setModulus(AppThatUsesTheCounter.java:13) at hr. Budu¢i da od nje nema kamo dalje (to je metoda od koje je program zapo£eo). takožer u njenom prvom retku..intermediateMethod(AppThatUsesTheCounter.tel.AppThatUsesTheCounter. IZNIMKE at hr.jsem. U intermedi—tewethod iznimka rethrow ). sve iznimke obraživati u metodi m—in: Ispis 4.main(AppThatUsesTheCounter. koja je vrsta iznimke (slleg—lE ergumentix™eption) Varijabli jednost jer i njen pobliºi opis (Negativan ciklus brojanja).76 POGLAVLJE 4.AppThatUsesTheCounter. u nedostatku koda koji ju obražuje. i intermediateMethod uspje²no zavr²ava nisu ispisale.jsem.fer. U ve¢ini realnih situacija trebat ¢e se na odgovaraju¢i na£in pobrinuti za iznimnu situaciju i zatim nastaviti s izvr²avanjem programa. a ve¢ u sljede¢em retku se njena vrijednost treba ispisati. niti metoda koja ju je izravno pozvala. Sve se to dogodilo automatski. bez ijednog retka koda vezanog uz obradu iznimke. £itav program je prekinut uz prethodni ispis detaljnog izvje²taja o tome gdje je to£no do²lo do iznimke (cjelokupan redoslijed pozivanja metoda i to£no mjesto u kodu gdje se svaki poziv dogaža). ˜ u metodi m—in o£ito nije mogla biti dodijeljena nijedna vrinije zavr²ila vra¢anjem povratne vrijednosti.2 Hvatanje iznimke  obrada iznimne situacije Prikazani na£in kori²tenja iznimke jo² uvijek nije previ²e svrsishodan jer ¢e uslijed svakog bacanja iznimke program pucati.tel. Moºemo npr. intermedi—tewethod Iz toga je ve¢ jasno da se izvr²avanje ne moºe nastaviti normalnim putem jer je varijabla ostala neinicijalizirana.jsem.tel..4: Hvatanje iznimke pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ˜oole—n ˜Y try { ˜ a intermedi—tewethod@ EI AY .fer.AppThatUsesTheCounter.java:8) at hr. 4.java:18) Primijetimo da se poruke intermediateMethod je vratila.fer. Iznimka je se pojavila u prvom retku i. Klju£na je prednost ²to moºemo odabrati u kojoj metodi ¢emo napraviti provjeru  to ne treba biti niti metoda gdje je do²lo do pogre²ke. tu je metoda zavr²ila ponovnim bacanjem iste iznimke (eng. tako stigla do metode m—in.

Sama iznimka koja ¢e biti uhva¢ena moºe biti instanca navedene klase ili bilo koje potklase  isto vrijedi i za parametar metode. izvr²avanjem koda koji slijedi nakon £itave konstrukcije Ostatak koda nakon pojave iznimke pa do kraja bloka tryFFF™—t™h. Nakon ove konstrukcije slijedi blok koda u kojem se ime€—r—metr— moºe koristiti kao i svaka druga varijabla. Da je iznimka normalan objekt najjasnije eFprintƒt—™k„r—™e@AY Tu smo pozvali metodu nad objektom iznimke. kao ²to je pokazano u ispisu 4. Ako je iznimka uspje²no uhva¢ena u odgovaraju¢em bloku ™—t™h. ƒitava konstrukcija je ™—t™h @ VrstaIznimke imeParametra A i vrlo je srodna konstrukciji za deklaraciju parametra metode. U protivnom bismo se ponovo susreli s problemom ²to . Ovo je vrlo korisna metoda jer ona ispisuje izvje²taj o iznimci. koja koristi i dvije nove klju£ne rije£i: try i ™—t™h. kojom raspolaºe svaka iznimka i vra¢a poruku koja joj je dodijeljena prilikom bacanja. a bez prekidanja programa. operatorom se vidi po izjavi new. ali u kojem bi moglo do¢i i do iznimke. Iznimku se kreira na uobi£ajen na£in. U gornjem primjeru nad njom se poziva metoda getwess—ge.3. prije prekida programa. try ne¢e se izvr²iti  a to je i bio cilj.POGLAVLJE 4. Nakon izvr²enja ovog bloka program dalje nastavlja normalno. Ovom metodom moºemo eksplicitno zatraºiti takav izvje²taj. Iznimku se hvata klju£nom rije£ju ™—t™h. Ranije je prikazan primjer u kojem se izvje²taj ispisuje automatski. Izvje²taj se ²alje na standardni izlaz za pogre²ke (ƒystemFerr). U Javi to je jednostavno objekt kao i svaki drugi  instanca klase j—v—Fl—ngFix™eption ili bilo koje njene potklase. Pomo¢u try najavljuje se blok koda koji ¢e se poku²ati izvr²iti. IZNIMKE 77 } ƒystemFoutFprintln@ 4intermedi—tewethod je vr—til— 4 C ˜ AY } ™—t™h @ slleg—lergumentix™eption e A { ƒystemFerrFprintln@ 4sznimk—34AY eFprintƒt—™k„r—™e@AY } ˜ a intermedi—tewethod@ I AY ƒystemFoutFprintln@ 4hrugi poku²—jX intermedi—tewethod je vr—til— 4 C ˜ AY Tu se pojavljuje nova konstrukcija. U ovom trenutku potrebno je napomenuti par detalja u vezi s karakterom iznimke. ne¢e se dalje bacati.

internetskih konekcija i sl. bez obzira je li do²lo do iznimke. IZNIMKE u£initi npr. pozivaju¢oj metodi. ako ba£ena iznimka nije one vrste koja se hvata om.78 POGLAVLJE 4. ™—t™h- S druge strane. tipi£an slu£aj je zatvaranje datoteka. 4. pona²anje ¢e biti kao da tog bloka i nema  iznimka ¢e se proslijediti dalje. s neinicijaliziranom varijablom ˜. To je prvenstveno korisno za slu£aj kad dože do iznimke jer u tom bloku imamo ²ansu obaviti neku zavr²nu radnju  npr.  prije nego ²to se metoda prekine bacanjem iznimke.5: Blok fin—lly pu˜li™ ™l—ss wodulogounter { FFF priv—te void setwodulus@ int newwodulus A { if @ newwodulus ` H A throw new slleg—lergumentix™eption@ 4xeg—tiv—n ™iklus ˜roj—nj—4 AY } } FFF pu˜li™ ™l—ss epp„h—t…ses„hegounter { priv—te st—ti™ ˜oole—n intermedi—tewethod@ int i A { try { wodulogounter m™ a new wodulogounter@AY m™Fsetwodulus@ i AY } fin—lly { ƒystemFoutFprintln@ 4intermedi—tewethod z—vr²—v—4 AY } return trueY } . Za to sluºi klju£na rije£ fin—lly: Ispis 4.3 Blok Zavr²ne radnje prije bacanja iznimke  blok finally try moºemo popratiti i posebnim blokom koda koji ¢e se sigurno izvr²iti.

Jedino treba po²tivati pravilo da na kraj. 4. Od svih njih izvr²it ¢e najvi²e jedan. IZNIMKE 79 } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ˜oole—n ˜Y try { ˜ a intermedi—tewethod@ EI AY ƒystemFoutFprintln@ 4intermedi—tewethod je vr—til— 4 C ˜ AY } ™—t™h @ slleg—lergumentix™eption e A { ƒystemFoutFprintln@ 4sznimk—X 4 C eFgetwess—ge@A AY } ˜ a intermedi—tewethod@ I AY ƒystemFoutFprintln@ 4hrugi poku²—jX intermedi—tewethod je vr—til— 4 C ˜ AY } O£ekivan ispis za ovaj. i kad nije. mogu¢e je nakon bloka mnogo blokova try imati ne jedan. nego proizvoljno ™—t™h. ali op¢enito dože oni se mogu i kombinirati.4 Vi²estruki blokovi catch Jo² jedna prednost mehanizma iznimki je u tome ²to moºemo imati podulji blok koda u kojem se mogu pojavljivati raznorazne iznimke bez potrebe da se svaka obražuje tamo gdje se pojavila. svaki za svoju vrstu iznimke. iza fin—lly ™—t™h. Ona vra¢a znakovni niz koji je prosliježen konstruktoru prilikom bacanja iznimke.POGLAVLJE 4. U primjeru je kori²tena jo² jedna metoda denirana za sve iznimke  getwess—ge. Da bi ta prednost bila u potpunosti iskoristiva. Realisti£an primjer u kojem je potrebno hvatati razne iznimke bio bi prili£no kompleksan pa ¢emo ovdje dati samo shematski primjer: . i to prvi £ija vrsta parametra odgovara vrsti iznimke. kao i blok ™—t™h u metodi m—in. U gornjem primjeru blok fin—lly kori²ten je samostalno. ve¢ dosta sloºen slu£aj je: intermedi—tewethod z—vr²—v— sznimk—X xeg—tiv—n ™iklus ˜roj—nj— intermedi—tewethod z—vr²—v— hrugi poku²—jX intermedi—tewethod je vr—til— true Vidimo kako se sada tekst intermediateMethod zavr²ava ispisuje u oba slu£aja  i kad je do²lo do iznimke.

Ako se pojavi iznimka koju se ne hvata. Vaºno je. u protivnom ¢e uvijek on hvatati iznimku. naravno. Mežutim.6: Vi²estruki blokovi ™—t™h pu˜li™ int somewethod@A { try { methodI@AY methodP@AY methodQ@AY return HY } ™—t™h @ slleg—lergumentix™eption e A { ƒystemFerrFprintln@ 4€ogre²—n —rgument4 AY } ™—t™h @ xull€ointerix™eption e A { ƒystemFerrFprintln@ 4xulEreferen™—4 AY } ™—t™h @ pilexotpoundix™eption e A { ƒystemFerrFprintln@ 4h—totek— ne postoji4 AY } ™—t™h @ ix™eption e A { ƒystemFerrFprintln@ 4xepredvižen— iznimk—4 AY } fin—lly { ƒystemFerrFprintln@ 4flok try z—vr²—v—4 AY } return EIY } Uo£imo da se u posljednjem bloku ™—t™h hvata vrsta ix™eption. Vidimo dakle da se blok fin—lly izvr²ava apsolutno uvijek. Ako dože do iznimke. Potpuni redoslijed izvr²avanja je sljede¢i: prvo se normalno izvr²ava kod bloka try. izvr²ava se blok fin—lly i nakon toga metoda se prekida ponovnim bacanjem iste iznimke. prije toga izvr- fin—lly. Taj blok je tu da uhvati bilo koju iznimku koju nije uhvatio nijedan prethodni blok. bez obzira za- . fin—lly izvr²a- vanje nastavlja redovitim putem i nailazi se na vrijednost return EI pa metoda vra¢a EI. Ako ne dože do iznimke. da taj blok bude posljednji. u posljednjem retku bloka try metoda treba uredno zavr²iti s povratnom vrijednosti ²ava se blok H. IZNIMKE Ispis 4.80 POGLAVLJE 4. izvr²ava se odgovaraju¢i blok U tom slu£aju nakon izvr²enja ™—t™h i nakon njega fin—lly.

IZNIMKE 81 vr²ava li blok try na redovan ili izniman na£in i bez obzira je li iznimka uhva¢ena ili nije.POGLAVLJE 4. Iznimke se u Javi dijele na dvije podvrste: checked ) i neprovjeravane (eng. ali kompilatoru je dovoljna £injenica da se ko- risti konstruktor koji tu iznimku najavljuje. svaka metoda koja poziva na²u metodu . provjeravana i neprovjeravana iznimka provjeravane (eng. Na² primjeri£ni kod ne sadrºi eksplicitnu izjavu throw new pilexotpoundix™eption@A. Budu¢i da tu iznimka ne hvata. U konstruktoru klase pilesnputƒtre—m najavljeno je da bi mogao baciti provjeravanu iznimku pilexotpoundix™eption (ako zatraºena datoteka ne postoji). ali kompilatoru je dovoljna sama najava.7: Najava iznimke import j—v—FioFBY FFF pu˜li™ st—ti™ void filewethod@A throws pilexotpoundix™eption { pile f a new pile@ 4GhrGferGtelGfileIFtxt4 AY snputƒtre—m fis a new pilesnputƒtre—m@ f AY FFF } U primjeru se koriste Javine ugražene klase za baratanje datotekama (iz paketa j—v—Fio). spomenuti konstruktor moºe biti izveden i tako da nikad ne baci iznimku. Iz navedenoga je jasno zna£enje pridjeva provjeravana: za takvu iznimku kompilator provjerava moºe li do¢i do njenog bacanja i inzistira da to bude najavljeno. Op¢enito. 4. ostale su provjeravane. ali to ne najavljuje. Sve neprovjeravane iznimke izvedene su iz ‚untimeix™eption. na²a metoda takožer mora najaviti da bi mogla baciti ovu iznimku.5 Najava iznimke. Sama ‚untimeix™eption je izravna potklasa spomenute klase ix™eption. Isto tako. throws: Ako se moºe dogoditi da metoda baci provjeravanu iznimku. u protivnom ¢e prevoditelj prijaviti pogre²ku da metoda moºe baciti doti£nu iznimku. unchecked ). tada ju je potrebno najaviti klju£nom rije£ju Ispis 4.

S druge strane. Takav je na² raniji primjer s metodom  ona je dizajnirana da prima pozitivan broj i nijedan smislen poziv ne moºe biti s negativnim brojem. da bude spreman na mogu¢nost pojave doti£ne iznimke. Kori²tenjem provjeravane iznimke posti¢i ¢emo to da programer ne moºe zabunom zaboraviti zapisati kod koji obražuje tu uvijek prisutnu mogu¢nost. 4. npr. pu˜li™ void throwingwethod@A throws pilexotpoundix™eptionD gl—ssxotpoundix™eptionD x—mingix™eption { FFF } . Najava neprovjeravane iznimke nema nikakvog utjecaja na kompilator  iznimka i dalje ostaje neprovjeravana. se prijavljuje neprovjeravana iznimka koristi se za slu£ajeve u kojima neispravnost  situacija do koje u ispravnom programu jedsetwodulus nostavno ne smije do¢i. iako nije duºan i²ta poduzeti. odvojene zarezom. To op¢enito i ne mora zna£iti da je do²lo do pogre²ke  radi se jednostavno o izvanrednoj situaciji koju se zahvaljuju¢i mehanizmu iznimaka moºe obraživati na mjestu gdje je to najprakti£nije. ispravnog izvr²avanja programa. Java dozvoljava da se i neprovjeravane iznimke najavljuju  kao pomo¢ programeru koji koristi takvu metodu.5. gdje je nejasno koju vrstu iznimke koristiti. mora da se radi o programerskoj pogre²ci. u na²em slu£aju programer ne moºe unaprijed znati ho¢e li potrebna datoteka postojati svaki put kad se program izvr²ava. Mogu¢nosti za ovakve pogre²ke vrebaju na svakom koraku i kod bi bio neprihvatljivo nepregledan kad bi se inzistiralo na najavi ili obradi svake mogu¢e takve iznimke.1 Najava vi²e iznimki Metoda moºe najaviti proizvoljan broj iznimki. Na primjer. Dakle. Najavljena iznimka korisna je za slu£ajeve kad do nje moºe do¢i tijekom normalnog.82 POGLAVLJE 4. IZNIMKE filewethod morat ¢e se pobrinuti za ovu iznimku  £ak i ako izbacimo redak u kojem se koristi sporni konstruktor. Navodi ih se redom. U praksi uvijek postoje i rubni slu£ajevi.

6 je klasa Klasna hijerarhija iznimki ix™eption kao glavna klasa iz koje su izvedene druge iznimke. Throwable Error Exception RuntimeException pogreške koje signalizira JVM provjeravane iznimke neprovjeravane iznimke Slika 4.7 Kori²tenje ugraženih i vlastitih iznimki U Javinoj biblioteci postoji ve¢ mno²tvo iznimki. provjeravanih i neprovjeravanih. IZNIMKE 83 4. Prije svega tu je klasa „hrow—˜le.POGLAVLJE 4. potpuna slika uklju£uje jo² nekoliko klasa.1: UML-ov dijagram klasa £ije instance se mogu baciti 4. Me- Dosad je spomenuto nekoliko detalja o hijerarhiji klasa iznimki. ima op¢enit karakter i u kodu ih treba koristiti gdje god zna£enje odgovara karakteru pogre²ke: . Klasa potklase rezervirane su za uporabu od strane Javinog virtualnog stroja i nisu namijenjene da ih se eksplicitno baca izjavom throw. „hrow—˜le iz koje su izvedene to£no dvije klase: irror i ix™eption. irror Dakle. Dodatne klase iznimki koje uvode razvijatelji neizostavno moraju biti potklase od ix™eption. neprovjeravanih. Cjelokupna hije- rarhija klasa £ije instance se mogu baciti prikazana je na slici 4.1. Spomenuta žutim. Nekoliko njih. i njene je u korijenu £itave klasne hijerarhije iznimki.

Primjer: Ispis 4. ve¢ se mora poni²titi. • gl—ssg—stix™eption baca se ako je metoda pozvana s instancom krive klase. nekoliko iznimki. IZNIMKE • xull€ointerix™eption baca se kad god se problem sastoji od toga da je neka referenca jednaka null umjesto da pokazuje na neki objekt. Recimo da imamo klasu koja predstavlja broja£ koji odbroji do neke kona£ne vrijednosti i nakon toga ne moºe dalje.84 POGLAVLJE 4.8: Deniranje vlastite iznimke pu˜li™ ™l—ss gounterix™eption extends ‚untimeix™eption { pu˜li™ gounterix™eption@A . • slleg—lƒt—teix™eption baca se kad se neku metodu pozove dok je objekt u takvom stanju koje ne dopu²ta njezino pozivanje. Ako ih je vi²e. U klasi treba samo denirati konstruktore koji primaju iste parametre kao ve¢ postoje¢i konstruktori u natklasi i samo prosliježuju poziv na njih. preporu£a se da sve budu izvedene iz jedne. Ako u trenutku kad je broja£ ve¢ do²ao do gornje granice pozovemo to bi bila situacija za bacanje ove iznimke. op¢enite. Za situacije speci£ne za softverski proizvod koji razvijamo treba denirati vlastitu klasu iznimke. • slleg—lergumentix™eption baca se kad se ustanovi da je metoda po- zvana s pogre²nom vrijednosti nekog argumenta  vrijednosti koja je protivna pravilima pozivanja doti£ne metode. Pravilo je da za £itav proizvod postoji samo jedna ili eventualno. To se tipi£no dogaža kad objekt najavljuje da implementira neko su£elje. Deniranje vlastite iznimke vrlo je jednostavno  dovoljno je kreirati klasu izvedenu iz za provjeravane odnosno ix™eption ‚untimeix™eption za neprovjeravane iznimke. To se dogaža tipi£no kad se radi o metodi koja je dio nekog su£elja pa formalno prima parametar op¢enitije vrste od one s kojom stvarno moºe raditi. ali neka od metoda iz su£elja nije primjerena za takav objekt pa ju nema smisla implementirati. U ovom poglavlju imali smo primjer pozivanja setwodulus s negativnim brojem. • …nsupportedyper—tionix™eption baca se ako je metoda pozvana nad objektom koji ju ne implementira. za ve¢e projekte. in™rement.

POGLAVLJE 4. Denirana su £etiri standardna konstruktora i sve ²to rade je da pozivaju isti takav konstruktor u natklasi. . IZNIMKE 85 { } super@AY pu˜li™ gounterix™eption@ ƒtring mess—ge A { super@ mess—ge AY } pu˜li™ gounterix™eption@ ƒtring mess—geD „hrow—˜le ™—use A { super@ mess—geD ™—use AY } pu˜li™ gounterix™eption@ „hrow—˜le ™—use A { super@ ™—use AY } } Ovime je denirana neprovjeravana iznimka gounterix™eption.

.

Kolekcija je jednostavno skupina objekata koju se moºe tretirati lista i skup. generics. List i Set golle™tion jedno je od temeljnih su£elja u Collections Framework -u.1: Osnovno baratanje kolekcijom st—ti™ void m—nipul—tegolle™tion@ golle™tion`ƒtringb ™ol A { ƒtring msg a 4€oruk—4Y ˜oole—n ˜ a ™olF—dd@ msg AY 87 . Apstrahira mogu¢nosti zajedni£ke za sve kolekcije  liste. a Java podrºava jo² i repove. Struktura srodna kolekciji je i mapa (skup parova klju£-vrijednost). Uz kolekcije veºu se i dosad neprikazana jezi£na svojstva Jave  tzv. To su£elje je denirano ponajprije iz razloga koji je iznesen u odjeljku 1. Collections Framework. Pogle- dajmo metodu u kojoj se demonstrira nekoliko osnovnih tehnika baratanja kolekcijom: Ispis 5. Kolekcije primitivnih podataka podrºane su neizravno  putem posebnih objekataprimitivnih podataka.1 Su£elje Su£elja Collection. nalazi se po- ve¢i broj su£elja i klasa koje sa£injavaju sustav za manipulaciju kolekcija.7  da putem varijable (parametra) ove vrste moºemo baratati bilo kojom kolekcijom u opsegu funkcionalnosti koji je zajedni£ki za sve njih. kao cjelinu. skupove i repove.Poglavlje 5 Kolekcije objekata kolekcije Jedna vrlo zna£ajna stvar u svakom programskom jeziku su po- dataka. U biblioteci klasa. 5. Osnovni primjeri su Jezik Java pruºa dobru podr²ku za kolekcije objekata. u paketu omota£a j—v—Futil. tzv.

™ont—ins. ƒtring. size. isimpty. drºi instance klase golle™tion`ƒtringb parametrizirana vrsta  parametar je vrsta objekata koji se u njoj nalaze.88 POGLAVLJE 5.2: Lista i skup pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { vist`ƒtringb listI a new err—yvist`ƒtringb@AY vist`ƒtringb listP a new vinkedvist`ƒtringb@AY ƒet`ƒtringb setI a new r—shƒet`ƒtringb@AY ƒet`ƒtringb setP a new „reeƒet`ƒtringb@AY ƒystemFoutFprintln@ 4€oziv s err—yvistX4 AY m—nipul—tegolle™tion@ listI AY ƒystemFoutFprintln@ 4’n€oziv s vinkedvistX4 AY m—nipul—tegolle™tion@ listP AY ƒystemFoutFprintln@ 4’n€oziv s r—shƒetX4 AY m—nipul—tegolle™tion@ setI AY ƒystemFoutFprintln@ 4’n€oziv s „reeƒetX4 AY m—nipul—tegolle™tion@ setP AY } . u deklaraciji paraTime nazna£ujemo da kolekcija saje tzv. golle™tion`ƒtringb ™ol. Kôd demonstrira kori²tenje metoda su£elja golle™tion: —dd. KOLEKCIJE OBJEKATA if @ ˜ A ƒystemFoutFprintln@ 4€oruk— dod—n— u kolek™iju4 AY ƒystemFoutFprintln@ 4ƒ—drºi li kolek™ij— porukuc 4 C ™olF™ont—ins@ msg A AY ˜ a ™olF—dd@ msg AY if @ ˜ A ƒystemFoutFprintln@ 4€oruk— dod—n— u kolek™iju drugi put4 AY ƒystemFoutFprintln@ 4froj elemen—t— u kolek™ijiX 4 C ™olFsize@A AY ˜ a ™olFremove@ msg AY if @ ˜ A ƒystemFoutFprintln@ 4€oruk— uklonjen— iz kolek™ije4 AY ƒystemFoutFprintln@ 4ƒ—drºi li kolek™ij— porukuc 4 C ™olF™ont—ins@ msg A AY } ƒystemFoutFprintln@ 4te li kolek™ij— pr—zn—c 4 C ™olFisimpty@A AY Sintaksu vezanu uz metra metode: generics Vrsta vidimo u prvom retku. Napravimo ovakvu metodu m—in da to ispitamo: Ispis 5. Razlika ¢e prije svega biti izmežu lista i skupova. Ispis ¢e se razlikovati ovisno o tome koja konkretna implementacija kolekcije se proslijedi metodi. remove.

Za err—yvist i vinkedvist dobit ¢emo sljede¢i ispis: €oruk— dod—n— u kolek™iju ƒ—drºi li kolek™ij— porukuc true €oruk— dod—n— u kolek™iju drugi put froj elemen—t— u kolek™ijiX P €oruk— uklonjen— iz kolek™ije ƒ—drºi li kolek™ij— porukuc true €oruk— uklonjen— iz kolek™ije drugi put te li kolek™ij— pr—zn—c true Za r—shƒet i „reeƒet ispis ¢e izgledati druga£ije: €oruk— dod—n— u kolek™iju ƒ—drºi li kolek™ij— porukuc true froj elemen—t— u kolek™ijiX I €oruk— uklonjen— iz kolek™ije ƒ—drºi li kolek™ij— porukuc f—lse te li kolek™ij— pr—zn—c true Primijetimo da poruka nije dodana/uklonjena po drugi put jer skup po deniciji sadrºi elemente bez ponavljanja. r—shƒet i „reeƒet su konkretne klase koje implementiraju skup. atributa itd. U praksi se rutinski koristi drºi u polju (eng.2). kad neko od svoj- err—yvist ne zadovoljava (npr. vinkedvist su konkretne klase koje imple- mentiraju listu. stava err—yvist koja elemente liste array ). Rutinski se koristi r—shƒet. . na bazi he²-tablice. ovisno o namjeni  a nikada err—yvist ili r—shƒet. err—yvist a Svako od njih dodaje metode speci£ne za i listu odnosno skup. vinkedvist samo iznimno. Ovo je equ—ls i jedan primjer klase koja ne¢e ispravno raditi ako ju koristimo s objektima koji nemaju ispravno izvedene metode 3. izvedena iz su£elja vist i ƒet su su£elja golle™tion. Same klase ne deniraju gotovo ni- jednu dodatnu metodu i gotovo nikad nema razloga koristiti ih za vrstu varijable (ili parametra. ako ¢e postojati velike oscilacije u broju pospremljenih elemenata). KOLEKCIJE OBJEKATA 89 Ovdje je uveden £itav niz novih vrsta podataka. U metodi m—in kori²ten je udoma¢eni pristup da se za vrstu varijable uvijek koristi su£elje  tipi£no konkretne vrste vist ili ƒet. objekti trebaju imati deniran ƒortedƒet).).1).POGLAVLJE 5. Svi hijerarhijski odnosi spominjanih referentnih vrsta prikazani su na slici 5.1. Njihovim kori²tenjem samo onemogu¢ujemo kasniji jednostavan prelazak na druga£iju implementaciju.6. h—shgode (vidjeti odjeljak „reeƒet je speci£an po tome ²to sortira svoje elemente (implementira i posebno su£elje za sortirane skupove  mogu¢e. Dodatna osobina skupa je da ne zadrºava poredak kojim su elementi dodavani u njega (za razliku od liste). Da bi sortiranje bilo (vidjeti odjeljak prirodni poredak 5.

ƒlan iza dvoto£ke je kolekcija po kojoj treba obaviti prelazak. Za to postoji posebna jezi£na konstrukcija. tzv.1: UML-ov dijagram klasa za Collection-Framework 5.2 Prelazak preko svih £lanova kolekcije enhanced for 1 : enhanced for Naj£e²¢i na£in kori²tenja kolekcije je da se priježe po svakom njenom £lanu. Izraz u zagradama prije dvoto£ke je deklaracija varijable koja ¢e u svakom koraku petlje sadrºati po jedan element kolekcije. jedan po jedan. i obavi neki posao. 1 U praksi se jo² koriste i izrazi for each i for/in . KOLEKCIJE OBJEKATA «interface» Collection «interface» SortedSet «interface» Set «interface» List TreeSet HashSet ArrayList LinkedList Slika 5.3: Prolaz po kolekciji petljom st—ti™ void iter—teyvergolle™tion@ golle™tion`ƒtringb ™ol A { for @ ƒtring s X ™ol A ƒystemFoutFprintln@ 4ƒl—n kolek™ijeX 4 C s AY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { vist`ƒtringb list a new err—yvist`ƒtringb@AY listF—dd@ 4—4 AY listF—dd@ 4˜4 AY listF—dd@ 4™4 AY iter—teyvergolle™tion@ list AY } U metodi iter—teyvergolle™tion demonstrirana je konstrukcija enhanced for.90 POGLAVLJE 5. petlja Ispis 5.

KOLEKCIJE OBJEKATA 91 Ako metodu m—in prepravimo da koristi r—shƒet.4: Kolekcija i primitivne vrste podataka pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { vist`sntegerb intvist a new err—yvist`sntegerb@AY intvistF—dd@ P AY intvistF—dd@ Q AY intvistF—dd@ R AY if @ intvistF™ont—ins@ Q A A ƒystemFoutFprintln@ 4vist— s—drºi ˜roj Q4 AY for @ int i X intvist A ƒystemFoutFprintln@ 4ƒl—n listeX 4 C i AY vist`foole—nb ˜oolvist a new err—yvist`foole—nb@AY ˜oolvistF—dd@ true AY ˜oolvistF—dd@ P aa Q AY vist`gh—r—™terb ™h—rvist a new err—yvist`gh—r—™terb@AY ™h—rvistF—dd@ 9—9 AY ™h—rvistF—dd@ 9˜9 AY ™h—r ™ a ™h—rvistFget@ H AY GG dohv—¢— prvi element liste } . mo¢i ¢emo uo£iti da se po elementima ne prolazi u istom poretku u kojem smo ih dodavali: pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒet`ƒtringb set a new r—shƒet`ƒtringb@AY setF—dd@ 4—4 AY setF—dd@ 4˜4 AY setF—dd@ 4™4 AY iter—teyvergolle™tion@ set AY } Ispis: ƒl—n kolek™ijeX — ƒl—n kolek™ijeX ™ ƒl—n kolek™ijeX ˜ 5.3 Kolekcije i primitivne vrste podataka autoboxing/unboxing Podaci primitivne vrste ne mogu se spremati u kolekcije pa se koriste objekti-omota£i podataka primitivnih vrsta. Jezi£no svojstvo dozvoljava sintasku po kojoj izgleda kao da se spremaju sami podaci primitivne vrste.POGLAVLJE 5. Primjer: Ispis 5.

4 Napredni prelazak po £lanovima kolekcije enhanced for prikazana u odjeljku 5. koje bi tada bilo rezer- virano. Jedna od dodatnih mogu¢nosti je metoda objekt uklanja iz kolekcije: Ispis 5.) Za neke speci£ne namjene potrebno je koristiti upravo ovakvu sintaksu jer nam je tako eksplicitno dostupan poseban objekt  iterator next. KOLEKCIJE OBJEKATA 5. po kolek- ciji. koji se implicitno generira prilikom prevoženja te konstrukcije i koristi poznatu sintaksu petlje for: Ispis 5.5: Prolaz po kolekciji eksplicitnim kori²tenjem iteratora st—ti™ void iter—teyvergolle™tion@ golle™tion`ƒtringb ™ol A { for @ ster—tor`ƒtringb iter a ™olFiter—tor@AY iterFh—sxext@AY A { ƒtring s a iterFnext@AY ƒystemFoutFprintln@ 4ƒl—n kolek™ijeX 4 C s AY } } (u realnom slu£aju ne koristi se ime varijable iter.92 POGLAVLJE 5.6: Kori²tenje iteratora za mijenjanje liste remove kojom se trenutni pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { vist`sntegerb intvist a new err—yvist`sntegerb@AY intvistF—dd@ P AY intvistF—dd@ Q AY intvistF—dd@ R AY for @ ster—tor`sntegerb iter a intvistFiter—tor@AY iterFh—sxext@AY A { int i a iterFnext@AY if @ i aa Q A iterFremove@AY } for @ int i X intvist A ƒystemFoutFprintln@ 4ƒl—n kolek™ijeX 4 C i AY } . Prije prvog poziva te metode iterator jo² ne pokazuje ni na jedan element. Preusmjerujemo ga na sljede¢i element pozivom metode £ija povratna vrijednost je taj sljede¢i element. tako da se prvim pozivom dobiva prvi element. nego neko ime koje se ne moºe normalno pojaviti u kodu. Njega moºemo zamisliti kao pokaziva£ na trenutni objekt u kolekciji.2 kra¢i je zapis za ovakav Konstrukcija kod.

Mapa je korisna struktura podataka za velik broj namjena. Za prolazak po listama postoji i specijalizirani nudi jo² vi²e mogu¢nosti. KOLEKCIJE OBJEKATA 93 Postoje i druge mogu¢nosti. speci£nih za liste. kad god imamo zbirku objekata koje je potrebno dohva¢ati po imenu ili nekom drugom ID-ju. Ovaj primjer demonstrira njegovu uporabu: Ispis 5. Na primjer. U Javi je za mape denirano su£elje w—p.POGLAVLJE 5. Klju£ je dakle ²to kra¢i podatak na osnovu kojega se moºe nedvosmisleno identicirati neki ve¢i slog podataka. npr.5 Pojam Mapa mapa odnosi se na skup preslikavanja izmežu nekih podataka (vrijednosti ) i s njim povezanih identikacijskih podataka (njihovih klju£eva ). ve¢ina baza podataka koje sadrºe podatke o drºavljanima RH kao klju£ koriste JMBG jer je to kratak podatak jedinstven za svakog gražana.7: Klasa ƒtudent koja demonstrira mapu pu˜li™ ™l—ss ƒtudent { priv—te ƒtring idY priv—te ƒtring firstx—meY priv—te ƒtring l—stx—meY pu˜li™ ƒtudent@ ƒtring idD ƒtring firstx—meD ƒtring l—stx—me A { thisFid a idY thisFfirstx—me a firstx—meY thisFl—stx—me a l—stx—meY } FFF metode getsdD getpirstx—meD getv—stx—me FFF pu˜li™ ƒtring toƒtring@A { return thisFfirstx—me C 4 4 C thisFl—stx—meY } pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { ƒtudent studI a new ƒtudent@ 4idI4D 4fill4D 4w™qill4 AY ƒtudent studP a new ƒtudent@ 4idP4D 4tohn4D 4€epper4 AY w—p`ƒtringD ƒtudentb students a new r—shw—p`ƒtringD ƒtudentb@AY studentsFput@ studIFidD studI AY . vistster—tor koji 5. o kojima se moºe informirati u dokumentaciji [1].

ve¢ sadrºi pove¢i broj stati£kih metoda koje provode £esto kori²tene algoritme za obradu kolekcija. Za ove algoritme kaºe se da su shuffle. 5.6 ƒesto kori²teni algoritmi nad kolekcijama j—v—Futil postoji klasa U paketu golle™tions koja ne sluºi za instancira- nje. equ—ls i h—shgode u objek- ƒtring ima uredno implementirane ove Iz primjera mogu se i²£itati dvije najvaºnije metode su£elja w—p: put@ keyD value A i get@ key A. Time kaºemo kompilatoru da se objekte na²e klase moºe usporeživati samo s drugim objektima iste klase. Za ostale raspoloºive metode treba konzultirati dokumentaciju [1]. Op¢e- nito nije nuºno da klju£ bude dio objekta. jo² jedna klasa koja se oslanja na ispravno funkcioniranje metoda tima koji se koriste kao klju£. itd.Comparable<T> gomp—r—˜le`„b je parametrizirano  parametar je neka vrsta „. a drugi vrsta vrijednosti. sluºe¢i se Javinim po- polimorfni limorzmom. Postoje npr. KOLEKCIJE OBJEKATA studentsFput@ studPFidD studP AY ƒtudent fet™hedƒtudent a studentsFget@ 4idP4 AY ƒystemFoutFprintln@ 4hohv—¢eni studentX 4 C fet™hedƒtudent AY } } Denirana je mala klasa koja sadrºi podatke o studentu. ina£e. min. Op¢enito. ali druge vrijednosti ne¢e imati smisla  osim eventualno . Vrsta w—p je parametrizirana s dva parametra  prvi je vrsta klju£a. m—x jer.94 POGLAVLJE 5. Za mnoge algoritme (prije svega sort) potrebno je da elementi kolekcije budu usporedivi. Ovo je. naravno. sort. Isto se. reverse. I za klju£ i za vrijednost moºe se koristiti bilo koji objekt. Klasa metode pa ne¢e biti problema. U na£elu se kao parametar navodi upravo klasa u kojoj implementiramo to su£elje. tu bi se mogla staviti bilo koja klasa. Instance te klase spremaju se u mapu tako da se kao klju£ koristi atribut id. mogu raditi s velikim brojem razli£itih vrsta kolekcija. odnosi i na r—shw—p. ²to tehni£ki zna£i da moraju ispravno implementirati su£elje 5.1 Su£elje Implementiranje su£elja java. gomp—r—˜le. ali je uobi£ajeno. bilo koje vrste.lang.6.

Evo primjera komparatora za studente koji name¢e poredak po ID-ju: Ispis 5. dakle. Poredak objekata u kojem se nijedan objekt ne pojavljuje prije nekog drugog koji je od njega manji naziva se tih objekata.7 ™omp—re„o. Na primjer.POGLAVLJE 5.6. negativan ako je trenutni objekt manji od prosliježenog i pozitivan ako je trenutni objekt ve¢i od prosliježenog. u klasi mogli bismo tu metodu implementirati ovako: Ispis 5. KOLEKCIJE OBJEKATA 95 neke natklase trenutne klase.2 Poredak razli£it od prirodnog  su£elje java. u slu£aju da imamo vi²e sli£nih klasa £ije instance se mogu mežusobno usporeživati. 5.util. ƒtring-ovu implementaciju iste metode. usporežuje stu- dente po prezimenu.Comparator<T> golle™tions koje se oslanjaju na prirodni poredak obje- Sve metode u klasi kata imaju i verzije koje se oslanjaju na poseban objekt- komparator. Zna£enje pojmova manji odnosno ve¢i ovisi o vrsti objekta.9: Komparator za studente koji name¢e poredak po ID-ju pu˜li™ ™l—ss ƒtudentgomp—r—torfysd implements j—v—FutilFgomp—r—tor`ƒtudentb { .8: Metoda ™omp—re„o pu˜li™ ™l—ss ƒtudent implements gomp—r—˜le`ƒtudentb { FFF isti kod k—o r—nije FFF pu˜li™ int ™omp—re„o@ ƒtudent th—t A { return thisFl—stx—meF™omp—re„o@ th—tFl—stx—me AY } } Klasa sad najavljuje da implementira su£elje oslanjaju¢i se na gomp—r—˜le. Metoda ™omp—re„o. odrežuje prirodni poredak instanci klase u kojoj je implementirana. koji moºe nametnuti proizvoljan poredak nad objektima. Takav objekt mora implementirati su£elje j—v—FutilFgomp—r—tor`„b. Metoda prirodnim poretkom ƒtudent iz ispisa 5. Povratna vri- int koji mora biti nula za jednake objekte. Ovo su£elje sadrºi samo jednu metodu: jednost je ™omp—re„o@ „ A.

sort pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { vist`ƒtudentb students a err—ysF—svist@ new ƒtudent‘“ { new ƒtudent@ 4HHS4D 4toshu—4D 4flo™h4 AD new ƒtudent@ 4HHQ4D 4€—ul4D 4qr—h—m4 AD new ƒtudent@ 4HHR4D 4‚i™h—rd4D 4h—wkins4 AD new ƒtudent@ 4HHP4D 4‚i™k4D 4w—rtinoff4 AD } AY ƒystemFoutFprintln@ 4€o£etni popisX4 AY for @ ƒtudent student X students A ƒystemFoutFprintln@ student AY golle™tionsFsort@ students AY ƒystemFoutFprintln@ 4’nƒtudenti sortir—ni po prezimenuX4 AY for @ ƒtudent student X students A ƒystemFoutFprintln@ student AY golle™tionsFsort@ studentsD new ƒtudentgomp—r—torfysd@A AY ƒystemFoutFprintln@ 4’nƒtudenti sortir—ni po shEjuX4 AY for @ ƒtudent student X students A ƒystemFoutFprintln@ student AY } O£ekivani ispis: €o£etni popisX HHS toshu— flo™h HHQ €—ul qr—h—m HHR ‚i™h—rd h—wkins HHP ‚i™k w—rtinoff ƒtudenti sortir—ni po prezimenuX HHS toshu— flo™h HHR ‚i™h—rd h—wkins HHQ €—ul qr—h—m HHP ‚i™k w—rtinoff ƒtudenti sortir—ni po shEjuX HHP ‚i™k w—rtinoff HHQ €—ul qr—h—m HHR ‚i™h—rd h—wkins .3 Primjer kori²tenja metode Collections.6. KOLEKCIJE OBJEKATA } pu˜li™ int ™omp—re@ ƒtudent leftD ƒtudent right A { return leftFgetsd@AF™omp—re„o@ rightFgetsd@A AY } 5.96 POGLAVLJE 5.

KOLEKCIJE OBJEKATA 97 HHS toshu— flo™h .POGLAVLJE 5.

.

logi£ke vrijednosti na f—lse.2. U Javi polje je izvedeno kao objekt.1 Osnovni elementi sintakse Ispis 6.1. a reference na null. ƒlanovi polja inicijaliziraju se po istim pravilima kao i atributi objekta  brojevi na nulu.1: Rad s jednodimenzionalim poljem Jednodimenzionalna polja: int‘“ interr—yY GG dekl—r—™ij— v—rij—˜le polj— interr—y a new int‘Q“Y GG kreir—nje pr—znog polj— @popunjeno nul—m—A int i a interr—y‘H“Y GG pristup £l—nu polj— interr—y a { ID PD Q }Y GG kreir—nje uz popunu GG n—vedenim vrijednostim— Uo£imo sintaksu u posljednjem retku: na desnoj strani ne treba koristiti operator new i to£nu vrstu podataka. kao i ostalim objektima. Dvodimenzionalna polja (analogno i za vi²edimenzionalna): 99 . Dvodimenzionalno polje izvedeno je kao jednodimenzionalno polje referenci na druga jednodimenzionalna polja. Java ¢e automatski stvoriti polje one vrste koja je deklarirana na lijevoj strani. dovoljan je samo doslovan popis £la- nova. ali posebnog karaktera.Poglavlje 6 Polja Polje je blok u memoriji u koji je spremljen niz podataka iste vrste. Ovo treba uvijek imati na umu jer vrijedi sve re£eno za referentne varijable u odjeljku 2. 6. Polja su objekti posebne referentne vrste polja i njima se barata putem referenci. Sva polja u osnovi su jednodimenzionalna.

ƒtring‘“ stringerr—y. Sljede¢i primjer demonstrira ovo: Ispis 6. Time se vizualizira trokutasti izgled strukture.4: Trokutasto dvodimenzionalno polje pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { int‘“‘“ intPerr—y a { {II}D {PID PP}D {QID QPD QQ} }Y for @ int‘“ interr—y X intPerr—y A { for @ int i X interr—y A ƒystemFoutFprint@ 4 4 C i AY } ƒystemFoutFprintln@AY } U prvom retku koda kreira se polje polja tako da je njegov prvi £lan polje duljine jedan. .3: Prolaz po svim £lanovima polja petljom enhanced for pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { int‘“ interr—y a { ID PD QD RD S }Y for @ int i X interr—y A ƒystemFoutFprint@ 4 4 C i AY } ƒystemFoutFprintln@AY Dvodimenzionalno polje ne mora nuºno biti pravokutno. Ispis je ovakav: II PI PP QI QP QQ Polja mogu sadrºavati i reference na objekte.2: Rad s dvodimenzionalnim poljem int‘“‘“ interr—yY interr—y a new int‘P“‘Q“Y int i a interr—y‘H“‘H“Y interr—y a { {ID P}D {QD R}D {SD T} }Y Petlja enhanced for za prolaz po svim £lanovima polja: Ispis 6. U deklaraciji se navodi referentna vrsta. POLJA Ispis 6.100 POGLAVLJE 6. Zatim slijedi dvostruka petlja u kojoj se ispisuje cjelokupan sadrºaj stvorene strukture. ²to slijedi iz re£enog da je to ustvari polje polja. drugi £lan polje duljine dva i tre¢i £lan polje duljine tri. npr.

iskoristit ¢e se. Mežutim. svejedno je objekt todama. jednak njegovom ka- fin—l jer se kapacitet polja ne moºe naknadno mijenjati. . Metoda —svist moºe se iskoristiti i za jednostavno stvaranje liste popu- njene doslovno navedenim vrijednostima: vist`ƒtringb stringvist a err—ysF—svist@ 4r—rry4D 4woe4D 4toe4 AY Dobivena lista ima ksiran sadrºaj  zabranjeno je pozivati metode —dd. Ovdje. Prednost je i ²to se za rad s poljima moºe koristiti elegantnija sintaksa. Koristi ga se npr. polja su siroviji oblik strukture i stoga ra£unski i memorijski ekasnija. Ako je prosliježeno polje dovoljno veliko.POGLAVLJE 6. Javina biblioteka podrºava laku transformaciju izmežu kolekcija i polja: Ispis 6. POLJA 101 6. Svako polje ima i cjelobrojni atribut pacitetu.6: Pretvorbe izmežu polja i liste ƒtring‘“ stringerr—y a { 4r—rry4D 4woe4D 4toe4 }Y GG konverzij— polj— u listuX vist`ƒtringb stringvist a err—ysF—svist@ stringerr—y AY GG konverzij— liste u poljeX ƒtring‘“ stringerr—yP a stringvistFtoerr—y@ new ƒtring‘H“ AY Metodi toerr—y mora se proslijediti makar prazno polje jer je potrebna in- formacija o tome koju vrstu polja treba stvoriti. remove i ostale koje bi ga mijenjale.2 koji je Polje kao objekt inst—n™eof j—v—Fl—ngFy˜je™t. Atribut je length. iako nije u pravom smislu instanca neke klase. za sloºenije primjere prolaska po svim £lanovima polja: Ispis 6. pa raspolaºe i svim odgovaraju¢im me- Polje.5: Prolaz po polju kori²tenjem eksplicitnog indeksa int‘“ interr—y a new int‘Q“Y for @ int i a HY i ` interr—yFlengthY iCC A { int j a interr—y‘i“Y FFF } 6.3 Interakcija s kolekcijama Kolekcije su eksibilnije i op¢enito korisnije strukture od polja. naºalost ne pomaºu generics i to se ne dogaža automatski. u protivnom se stvara novo.

.

Za svaku vrstu resursa s ko- jim se moºe komunicirati (zaslon. reset i ™lose yutputƒtre—m. datoteka. Osnovna paradigma koja se u Javi koristi za razmjenu podataka s okolinom tok data stream ). za snputƒtre—m odnosno write.) postoje konkretne klase izvedene iz njih.1: Rad s izlaznim tokom import j—v—FioFyutputƒtre—mY import j—v—FioFsyix™eptionY FFF st—ti™ void send„oyutput@ yutputƒtre—m os A throws syix™eption { for @ int i a HY i ` PSTY iCC A osFwrite@ i AY osFflush@AY 103 . Nalaze se u paketu posve¢enom komunikaciji.1 je Tokovi podataka podataka (eng. j—v—Fio. flush i ™lose izlaznog toka: za Sljede¢i primjer demonstrira kori²tenje Ispis 7. Ovdje se prikazuje na koji na£in se u jeziku Java komunicira s okolinom.Poglavlje 7 Komunikacija s okolinom Svaka aplikacija treba komunicirati s okolinom. To se prije svega odnosi na korisni£ko su£elje (tipkovnica i zaslon). sustav datoteka i ra£unalsku mreºu. Postoje ulazni i izlazni tokovi i predodnosno stavljeni su apstraktnim klasama snputƒtre—m yutputƒtre—m. re—d. udaljeno ra£unalo itd. 7. Apstraktne klase deklariraju osnovne metode za rad s tokom  —v—il—˜le.

ve¢ samo da trenutno nema novih podataka. Metoda flush poziva se kad se ºeli osigurati da podaci budu odmah isporu£eni na odredi²te. 7. U nju ¢e zapisati niz okteta od nule do 255 i nakon toga ju zatvoriti. Metoda —v—il—˜le vra¢a broj okteta raspoloºivih odmah. to zna£i da je tok do²ao do kraja. Ako vrati nulu.2 Pisa£i i £ita£i Za komunikaciju tekstualnim podacima postoje posebni omota£i sirovih tokova okteta koji ih pretvaraju u tokove znakova. Kori²tenje mežuspremnika op¢enito zna£ajno podiºe ekasnost komunikacije jer se ²alju ve¢i blokovi podataka. KOMUNIKACIJA S OKOLINOM FFF d—ljnje oper—™ije n—d tokom FFF } osF™lose@AY Ova metoda moºe raditi s bilo kakvim izlaznim tokom. tako da flush ne treba koristiti ako to nije zaista potrebno.104 POGLAVLJE 7. Op¢enito se ne moºe samo ispitati je li tok do²ao do kraja bez poku²aja £itanja pa ne postoji posebna metoda za to koju bi se moglo koristiti u uvjetu petlje while. Ovaj primjer demonstrira kori²tenje ulaznog toka: Ispis 7. Ako vrati vrijednost EI. bez £ekanja.2: Rad s ulaznim tokom import j—v—FioFsnputƒtre—mY import j—v—FioFsyix™eptionY FFF st—ti™ void re™eivesnput@ snputƒtre—m is A throws syix™eption { while @ true A { int i a isFre—d@AY if @ i aa EI A ˜re—kY ƒystemFoutFprintln@ i AY } isF™lose@AY } Metoda re—d vra¢a pro£itani oktet. U protivnom ¢e se najvjerojatnije gomilati u mežuspremniku u radnoj memoriji dok ih se ne skupi dovoljno za masovno slanje. U Javinoj terminologiji . to ne mora zna£iti da je tok do²ao do kraja.

Povezuje ih se pri instanciranju proslježivanjem objekta toka konstruktoru.POGLAVLJE 7.3: Pisa£ i £ita£ import j—v—FioF‡riterY import j—v—FioF€rint‡riterY import j—v—FioF‚e—derY import j—v—FioFfuffered‚e—derY import j—v—FioFsyix™eptionY FFF st—ti™ void writeyutput@ ‡riter writer A throws syix™eption { €rint‡riter pw a new €rint‡riter@ writer AY pwFprintln@ 4€rvi red—k4 AY pwFprintln@ 4hrugi red—k4 AY pwFflush@AY pwF™lose@AY } st—ti™ void re—dsnput@ ‚e—der re—der A throws syix™eption { fuffered‚e—der ˜r a new fuffered‚e—der@ re—der AY while @ true A { ƒtring line a ˜rFre—dvine@AY if @ line aa null || lineFlength@A aa H A ˜re—kY ƒystemFoutFprintln@ line AY } ˜rF™lose@AY } Metoda re—dsnput zavr²it ¢e ako naiže na kraj ulaznog toka (line aa null) ili ako pro£ita prazan redak (lineFlength@A aa H). ali barataju podacima vrste Jo² je prakti£nije koristiti klase s ugraženim mežuspremnikom (fuffered‚e—der i €rint‡riter) koje omogu¢uju komunikaciju redak po redak umjesto znak po znak.4: Omota£i podatkovnih tokova import j—v—FioFyutputƒtre—mY . Ovo je prikazano u primjerima: Ispis 7.3 s odgovaraju¢e omotanim sirovim tokovima: Ispis 7. Sljede¢i primjer prikazuje metode koje pozivaju metode iz ispisa 7. ™h—r. KOMUNIKACIJA S OKOLINOM 105 to su pisa£i (osnovna klasa ‡riter) i £ita£i (osnovna klasa ‚e—der). Ko- riste se sli£no kao sirove tokove. Pisa£ i £ita£ rade tako da se povezuju sa sirovim tokom okteta i obavljaju potrebne konverzije.

4.3 i 7. KOMUNIKACIJA S OKOLINOM import j—v—FioFyutputƒtre—m‡riterY import j—v—FioFsnputƒtre—mY import j—v—FioFsnputƒtre—m‚e—derY import j—v—FioFsyix™eptionY FFF st—ti™ void writeyutput@ yutputƒtre—m os A throws syix™eption { writeyutput@ new yutputƒtre—m‡riter@ os A AY } st—ti™ void re—dsnput@ snputƒtre—m is A throws syix™eption { re—dsnput@ new snputƒtre—m‚e—der@ is A AY } 7.3. koja ¢e onda proslijediti poziv metodi re—dsnput@ fuffered‚e—der A iz ispisa 7.106 POGLAVLJE 7. vrste Stati£ki atribut out sadrºi referencu na objekt €rintƒtre—m. . svaki put kad se koristio izraz ƒystemFoutFprintln@ FFF A.3 Komunikacija s korisnikom Osnovna tekstualna komunikacija s korisnikom ostvaruje se putem standardnog ulaz/izlaza koji pruºa svaka ra£unalska platforma.4. Za prakti£no kori²tenje standardnog ulaza potrebno je eksplicitno dodati omota£e. U Javi se s njima povezuje putem stati£kih atributa u klasi ƒystem.4 moºemo isprobati dodavanjem sljede¢e metode m—in: import j—v—FioFsyix™eptionY FFF pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A throws syix™eption { ƒystemFoutFprintln@ 4…tipk—j ne²to34 AY re—dsnput@ ƒystemFin AY } U konzolu treba utipkati tekst i pritisnuti Enter. koja je vrlo srodna prikazanoj vrsti €rint‡riter i de- nira mnoge identi£ne metode. Program dovr²avamo utipkavanjem praznog retka. kao u ispisu 7. Kod iz ispisa 7. Ispis na standardni izlaz sreli smo ve¢ mnogo puta u kodu. Program ¢e ponoviti utipkano. Atribut ƒystemFin je vrste snputƒtre—m pa ¢e se pozvati metoda re—dsnput@ snputƒtre—m A iz ispisa 7.

I on se oslanja na metode iz ispisa 7. je li u pitanju prava datoteka ili kazalo itd. Ako datoteka ne postoji. import j—v—FioFsyix™eptionY import j—v—FioFpileyutputƒtre—mY import j—v—FioFpilesnputƒtre—mY import j—v—FioFpileY FFF pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A throws syix™eption { pile file a new pile@ 4„extFtxt4 AY fileF™re—texewpile@AY ƒystemFoutFprintln@ 4—pisujem u d—totekuFFF4 AY writeyutput@ new pileyutputƒtre—m@ file A AY ƒystemFoutFprintln@ 4ƒit—m iz d—totekeFFF4 AY re—dsnput@ new pilesnputƒtre—m@ file A AY } Moºemo vidjeti da se datoteku otvara za pisanje instanciranjem klase pileyutputƒtre—m £ita iz datoteke. Analogno se i 7. kojoj se proslježuje instanca klase pile. ƒim se taj objekt kreira. moºe ju se stvoriti. Sljede¢i kod demonstrira rad s datotekama. .4. Datotekama se u Javi barata putem objekata vrste handle - objekti jer postojanje objekta ne zna£i da postoji i datoteka koju on predstavlja.4 Rad s datotekama pile. To su tzv.3 i 7. Pozivom metode openƒtre—m automatski se obavljaju sve radnje potrebne za pristup resursu pod tim URL-om  kontaktira se DNS.3 i 7.5 Rad s internetskim konekcijama Za dohvat sadrºaja s nekog URL-a dovoljna su samo dva retka koda (uz ve¢ postoje¢i kod iz ispisa (7. KOMUNIKACIJA S OKOLINOM 107 7. otvara mreºna konekcija na potrebnom portu.4): j—v—FnetF…‚v url a new j—v—FnetF…‚v@ 4httpXGGwwwFgoogleF™om4 AY re—dsnput@ urlFopenƒtre—m@A AY Klasa …‚v predstavlja lokaciju na Internetu identiciranu URL-om ( uni- form resource locator ). datoteka je ve¢ otvorena i spremna za zapisivanje.POGLAVLJE 7. Objektu se zada putanja do datoteke i zatim ga se moºe pitati postoji li datoteka. ²alje HTTP-ov zahtjev za dostavom resursa i kreira objekt toka podataka koji ¢e isporu£ivati podatke koje posluºitelj ²alje kao odgovor.

.

109 . godine. pri izradi programskih rje²enja mnoge vrste problema koje treba rje²avati opetovano se pojavljuju bez obzira na konkretni zadatak. spominjao se ve¢ u poglavlju o kolekcijama. u odjeljku 5.6. prilikom refaktorizacije u odjeljku 1. 8. Sli£an polimorfni algoritam. ne¢e ulaziti u te nijanse. Ustvari. koja pokrivaju sve suptilnije nijanse problema .Poglavlje 8 Uzorci u dizajnu koda U praksi. Adapter i Decorator. primijenili smo ga jo² u prvom poglavlju. kad je objavljena kultna knjiga Design Patterns [3] £etvorice autora popularno zvanih The Gang of Four ili GoF. baratanje vokabularom vezanim uz uzorke (prije svega prepoznavanje uzoraka po imenu) bitno olak²ava komunikaciju izmežu razvijatelja. Drugo ime za izraz.11. Observer. koji tako mogu puno ekasnije raspravljati o svojim programskim rje²enjima. radi se naprosto o metodi koja u svojem kodu sadrºi 1 U ovoj skripti se. mežutim. kako se naj£e²¢e oslovljava i samu knjigu.1 Template method Template method je Ovaj uzorak jednostavan je za razumjeti i ima vrlo ²iroku primjenu. polimorfna metoda. Takožer. U ovom poglavlju bit ¢e kao primjer ove koncepcije prikazano nekoliko najjednostavnijih uzoraka: 1 Template method. Razvijatelj si moºe drasti£no olak²ati ºivot ako prou£i ta rje²enja tako da ih moºe primijeniti kad zatreba. Ovdje se daje samo najosnovniji uvod u koncepciju uzoraka. Ideja uzoraka u dizajnu koda doºivjela je najve¢i proboj 1995. Dakle. S vremenom su sazrijela za svaki takav tipi£an problem najbolja rje²enja.

bez posjedovanja .110 POGLAVLJE 8. UZORCI U DIZAJNU KODA pozive metoda koje podlijeºu polimorzmu odnosno dinami£kom povezivanju. Dakle. boju £vora. U na²em primjeru imali smo dvije varijante jednostavno se prosliježeni ƒimplegounter int zapisao u atribut. ali ne pro- pisuje to£no kako se postavlja novo stanje. bilo nekom daljnjem £voru i treba ga u skladu s time proslijediti dalje ili konzumirati. U malo naprednijem slu£aju trebat ¢e prikazati poruku u prozoru gra£kog su£elja. u najjednostavnijem slu£aju trebat ¢e ispisati tekstualnu poruku na standardni izlaz. Svaki komunikacijski £vor moºe primiti neki paket namijenjen bilo njemu. npr. Metoda na apstraktnoj razini implementira neki algoritam. šelimo da na²em objektu koji predstavlja komunikacijski £vor moºemo dodavati procedure za obradu dogažaja paket stigao u £vor X. U prvom poglavlju imali smo sljede¢i trivijalan primjer polimorfne metode: —˜str—™t ™l—ss e˜str—™tgounter implements gounter { FFF pu˜li™ fin—l void in™rement@A { setƒt—te@ getƒt—te@A C I AY } } —˜str—™t void setƒt—te@ int newƒt—te AY Metoda in™rement je polimorfna jer se oslanja na apstraktnu metodu setƒt—te. U tom slu£aju bit ¢e potrebno kad paket stigne u £vor promijeniti neki detalj u prikazu. gdje se pojedini koraci deniraju samo na razini ²to a ne i kako. ²to zna£i bez ikakvih intervencija u izvorni kod te klase  dapa£e. Na primjer.2 Observer Recimo da razvijamo softver za simulaciju rada mreºe TCP/IP. To ¢e ovisiti o konkretnoj implementaciji metode te metode: u klasi setƒt—te. dok se u klasi wodulogounter zapisao ostatak dijeljenja s modulom. 8. odrežuje da se mora postaviti novo stanje. Za o£ekivati je i da ¢emo imati gra£ki prikaz mreºe na kojem treba vizualizirati putovanje paketa od £vora do £vora. Sve te mogu¢nosti ºelimo imati na raspolaganju kao korisnik klase koja predstavlja mreºu TCP/IP.

p—™ket‚e™eived.6: Jednostavna implementacija oslu²kiva£a dolaznih paketa p—™k—ge hrFferFtelFjsemFo˜serverY pu˜li™ ™l—ss ƒysout‚e™eivevistenerrr implements ‚e™eivevistener { pu˜li™ void p—™ket‚e™eived@ €—™ket p—™ketD xode re™eivingxode A { ƒystemFoutFprintln@ 4ƒvor 4 C re™eivingxodeFgetx—me@A C 4 je primio p—ketX 4 C p—™ketFgeth—t—@A AY } } Klasa komunikacijskog £vora s podr²kom za oslu²kiva£e: Ispis 8. ali u kontek- listener ). ‚e™eivevistener. observer. On ima metodu koju ¢e objekt £vora —dd‚e™eivevistener. Ta podr²ka ugražuje se kori²tenjem uzorka Prvo ²to treba uvesti je objektstu Jave uobi£ajen je izraz oslu²kiva£ (to je Observer. Oslu²kiva£a kreiramo i prijavimo £voru  pozivanjem £vorove metode npr.POGLAVLJE 8. £vor mora pro¢i po listi svih prijavljenih oslu²kiva£a i pozvati njihovu metodu npr. UZORCI U DIZAJNU KODA 111 njenog izvornog koda. O£ito je da ¢e klasa £vora morati imati ugraženu podr²ku za to. Ispis 8. put kad primi paket. Svaki pozvati i time signalizirati stigao je paket. Za oslu²kiva£a prvo treba denirati su£elje. Njega onda mogu implementirati razli£ite verzije oslu²kiva£a.5: Su£elje oslu²kiva£a dolaznih paketa p—™k—ge hrFferFtelFjsemFo˜serverY pu˜li™ interf—™e ‚e™eivevistener { void p—™ket‚e™eived@ €—™ket p—™ketD xode re™eivingxode AY } Pokaºimo odmah i jednu jednostavnu implementaciju oslu²kiva£a: Ispis 8.7: Komunikacijski £vor s podr²kom za oslu²kiva£e p—™k—ge hrFferFtelFjsemFo˜serverY import j—v—FutilFr—shƒetY import j—v—FutilFƒetY . U toj metodi nalazi se kod koji obražuje dogažaj primitka paketa.

Ispis 8. UZORCI U DIZAJNU KODA pu˜li™ ™l—ss xode { priv—te fin—l ƒet`‚e™eivevistenerb re™visteners a new r—shƒet`‚e™eivevistenerb@AY priv—te fin—l ƒtring n—meY pu˜li™ xode@ ƒtring n—me A { thisFn—me a n—meY } pu˜li™ void —dd‚e™eivevistener@ ‚e™eivevistener listener A { thisFre™vistenersF—dd@ listener AY } pu˜li™ void re™eive€—™ket@ €—™ket p—™ket A { for @ ‚e™eivevistener listener X thisFre™visteners A listenerFp—™ket‚e™eived@ p—™ketD this AY } pu˜li™ ƒtring getx—me@A { return thisFn—meY } } Napokon.112 POGLAVLJE 8. Cilj je prikazati situaciju s vi²e od jednog oslu²kiva£a. Gore je prikazana klasa oslu²kiva£a koja ispisuje poruku na hrvatskom. pogledajmo primjer kako se sve ovo koristi. u primjeru koji slijedi pojavit ¢e se i klasa koja ispisuje poruku na engleskom.8: Kori²tenje sustava pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A { xode nodeI a new xode@ 4xodeI4 AY nodeIF—dd‚e™eivevistener@ new ƒysout‚e™eivevistenerin@A AY nodeIF—dd‚e™eivevistener@ new ƒysout‚e™eivevistenerrr@A AY ƒystemFoutFprintln@ 4’—ljemo p—ket £voruFFF4 AY nodeIFre™eive€—™ket@ new €—™ket@ 4„esting „esting IEPEQ4 A AY } Ispis: ’—ljemo p—ket £voruFFF xode xodeI re™eived p—™ketX „esting „esting IEPEQ ƒvor xodeI je primio p—ketX „esting „esting IEPEQ .

objekt vrste yutputƒtre—m. Podsjetimo se situacije koju smo imali. zamislimo da je metoda writeyutput@ ‡riter A ugražena u neku klasu za koju nemamo izvorni kod jer je ona dio biblioteke klasa koju samo koristimo. a s druge strane imamo sirovi tok u koji ta metoda treba slati podatke.POGLAVLJE 8. To je je tzv.4 imamo metodu writeyutput@ yutputƒtre—m A. S jedne strane imamo metodu koja o£ekuje znakovni tok. naziva impedance mismatch (neprilagoženost impedancija). klasa yutputƒtre—m‡riter. nama u implementaciji te metode upravo treba tok podataka u koji se mogu slati znakovi.3 Adapter Adapter i S primjerima uzoraka Decorator susreli smo se u poglavlju o komunikaciji s okolinom.2 o pisa£ima i £ita£ima. prilagoditi su£elje objekta koji imamo (sirovi tok) na su£elje objekta koji o£ekuje metoda iz biblioteke (znakovni tok). tj.3. u analogiji s elektrotehnikom. a ne razvijamo. sirovi tok podataka jer se preko njega ²alju £isti okteti. U primjeru s ispisa 7.4 koristi se Javin adapter. ²to je Javin izraz za odlazni znakovni U praksi ¢emo tipi£no imati ve¢ gotove komponente koje rade sa znakovnim tokovima i ne znaju raditi druga£ije. Dovedeni smo u situaciju koja se £esto u praksi. koja o£ekuje da ju se pozove s tok podataka. Mežutim. Njen parametar. Dakle. to£nije u odjeljku 7.9: Pokazna izvedba adaptera na znakovni tok p—™k—ge hrFferFtelFjsemY import j—v—FioFsyix™eptionY import j—v—FioFyutputƒtre—mY import j—v—FioF‡riterY pu˜li™ ™l—ss yutputƒtre—m‡riter extends ‡riter { priv—te yutputƒtre—m osY pu˜li™ yutputƒtre—m‡riter@ yutputƒtre—m os A { thisFos a osY . writeyutput@ ‡riter A. Problem ¢emo rije²iti primjenom uzorka Adapter  on ¢e nam adaptirati. Moramo napraviti klasu adaptera sa sirovog na znakovni tok. predstavlja od- lazni tok podataka. neki apstraktniji podaci kao ²to su znakovi. Pogledajmo kako bi ona mogla biti realizirana: Ispis 8. UZORCI U DIZAJNU KODA 113 8. a ne npr. pisa£em. To je zato ²to moramo pozvati metodu iz ispisa 7. U ispisu 7.

poglavlja tako da u na² paket dodamo klasu adaptera. a umjesto svih ostalih znakova ²alje znak metode. moºemo koristiti ovakvu metodu u klasu yutputƒtre—m‡riter: pu˜li™ st—ti™ void m—in@ ƒtring‘“ —rgs A throws syix™eption { ‡riter osw a new yutputƒtre—m‡riter@ ƒystemFout AY oswFwrite@ 4€ro˜ni ispis’n4 AY oswF™lose@AY } . m—in. UZORCI U DIZAJNU KODA } dyverride pu˜li™ void write@ ™h—r‘“ ™˜ufD int offD int len A throws syix™eption { for @ int i a offY i ` offClenY iCC A { ™h—r ™ a ™˜uf‘i“Y if @ ™ ` HxVH A osFwrite@ ™ AY else osFwrite@ 959 AY } } dyverride pu˜li™ void flush@A throws syix™eption { osFflush@AY } dyverride pu˜li™ void ™lose@A throws syix™eption { osF™lose@AY } } Ova jednostavna izvedba u sirovi tok propu²ta samo znakove iz podskupa Unicode -a zvanog Basic Latin. To je zahvalju- ju¢i tome ²to su sve ostale metode u toj klasi paºljivo izvedene tako da se oslanjaju na osnovnu funkcionalnost koju pruºaju samo ove tri. a izbacimo izjavu import j—v—FioFyutputƒtre—m‡riter.114 POGLAVLJE 8. dok klasa Primijetimo da su nadja£ane samo tri ‡riter posjeduje znatno ve¢i broj njih. koji odgovara ASCII-ju. 5. koju moºemo ubaciti Alternativno. Na² adapter moºemo isprobati na primjerima iz 7.

Na²a situacija prikazana je na slici 8. Problem koji sad ºelimo rije²iti je sljede¢i: ve¢ raspolaºemo 2 Metoda hod.1: UML-ov dijagram uzorka Adapter 8. njegova shema prikazana UML-om je idenuzorak ti£na. Uzorak Adapter moºemo dosta pregledno vizualizirati UML-om. nisu nam potrebne druga£ije metode (kao u slu£aju uzorka Adapter ). Client o e kuje ovakav objekt Client +writeOutput() Writer +write() +flush() +close() Adapter Ovakav objekt imamo OutputStreamWriter +write() +flush() +close() OutputStream +write() +flush() +close() Slika 8. Iz re£enog ve¢ moºemo naslutiti da je ovaj uzorak dosta blizak uzorku Adapter  dapa£e.1. U poglavlju o komunikaciji imamo situaciju na kojoj moºemo prikazati ovaj uzorak. Dakle. ali koja se oslanja na na²u metodu write@ ™h—r‘“D intD int A2 . UZORCI U DIZAJNU KODA 115 U drugom retku poziva se metoda write@ ƒtring A. write@ ƒtring A je stoga jo² jedan primjer primjene uzorka Template met- č ve¢ samo iz- . dakle nesugla- Osim ²to £esto imamo situaciju koju rije²avamo sje izmežu su£elja koje nam treba i su£elja koje imamo na raspolaganju.4 Decorator ed—pter-om.POGLAVLJE 8. Za takve situacije primjenjujemo Decorator. mijenjeno pona²anje postoje¢ih metoda. koju nismo ekspli- citno nadja£ali. £esto se pojavljuje i sli£na situacija u kojoj imamo objekt £ije su£elje odgovara. ali mu nedostaje jo² neka dodatna funkcionalnost. Tamo se pojavljuje klasa ‚e—der koja predstavlja neki dolazni znakovni tok.

116

POGLAVLJE 8.

UZORCI U DIZAJNU KODA

nekim objektom £ita£a, a ºelimo mu dodati funkciju korisnu prilikom traºenja pogre²aka u programu  da sve ²to pro£ita iz dolazne struje ispi²e i na

klasom £ita£a, £iji kod bismo mogli izmijeniti izravno, nego njenom instancom, dok samim izvornim kodom klase ne rapolaºemo.
zaslon radi kontrole. Naglasimo: ne kaºe se da raspolaºemo Kako ¢emo rije²iti ovaj problem? Denirat ¢emo novu klasu izvedenu iz klase

‚e—der.

Klasa, kao i kod

Adapter -a, ima karakter omota£a. U ovom
(hrv.

konkretnom slu£aju instanca na²e nove klase omota£ je za neki objekt vrste

‚e—der. Dakle, u uzorku Decorator

ukra²iva£ ) klasa koju ukra²avamo

pojavljuje se u dva konteksta odjednom: i kao vrsta ugraženog objekta (koji biva ukra²en), i kao natklasa ukra²iva£a. Najbolje je da prou£imo implementaciju na²eg ukra²iva£a: Ispis 8.10: Primjer primjene uzorka

Decorator

p—™k—ge hrFferFtelFjsemY import j—v—FioFsyix™eptionY import j—v—FioF‚e—derY pu˜li™ ™l—ss he˜ug‚e—der extends ‚e—der { priv—te ‚e—der rdrY pu˜li™ he˜ug‚e—der@ ‚e—der rdr A { thisFrdr a rdrY } dyverride pu˜li™ int re—d@ ™h—r‘“ ™˜ufD int offD int len A throws syix™eption { GG prvo prosliježujemo poziv n— omot—ni o˜jektX int ™h—rs‚e—d a thisFrdrFre—d@ ™˜ufD offD len AY GG z—tim o˜—vlj—mo dod—tne r—dnjeX if @ ™h—rs‚e—d 3a EI A ƒystemFoutFprintln@ 4‚e—ding 4 C ƒtringFv—lueyf@ ™˜ufD offD ™h—rs‚e—d A AY return ™h—rs‚e—dY } dyverride pu˜li™ void ™lose@A throws syix™eption { GG s—mo delegir—mo n— omot—ni o˜jektX

POGLAVLJE 8.

UZORCI U DIZAJNU KODA

117

}

}

thisFrdrF™lose@AY

Odmah moºemo uo£iti veliku sli£nost s primjerom za uzorak Kod

Adapter.

Adapter -a u igri su dvije razli£ite klase jer jednu prilagožavamo drugoj,

a ovdje samo dodajemo funkcionalnost jednoj klasi, koja se stoga pojavljuje u dvostrukoj ulozi. Na²u klasu

he˜ug‚e—der

moºemo isprobati na primjerima iz 5. poglavlja,

tako da prepravimo ovu metodu iz ispisa 7.4:

st—ti™ void re—dsnput@ snputƒtre—m is A throws syix™eption { re—dsnput@ new snputƒtre—m‚e—der@ is A AY }
Treba samo ubaciti jo² jedan omota£, na² ukra²iva£:

st—ti™ void re—dsnput@ snputƒtre—m is A throws syix™eption { re—dsnput@ new he˜ug‚e—der@ new snputƒtre—m‚e—der@ is A A AY }
Nakon toga moºemo isprobati primjere iz odjeljaka 7.37.5.

Decorator, kao ²to je najavljeno, u UML-ovom dijagramu izgleda vrlo sli£no kao Adapter. To se o£ituje na slici 8.2, na kojoj je jasno istaknuta
Uzorak dvojaka uloga ukra²avane klase . Kao primjer kori²tenja uzorka

3

Decorator

u Javinoj biblioteci moºemo

izdvojiti klase koje se pojavljuju u poglavlju o komunikaciji s okolinom:

€rint‡riter

i

fuffered‚e—der.

Te klase su i posebno zanimljive jer one istonpr. klasa

vremeno implementiraju i

Adapter i Decorator :

fuffered‚e—der,
koje nema

osim ²to dodaje funkcionalnost mežuspremnika svim postoje¢im metodama (ukra²avanje), ima i dodatnu, vrlo zna£ajnu metodu u obi£nom

re—dvine,

‚e—der-u. re—dvine.

Iz perspektive nekog koda koji o£ekuje da ¢e £ita£i

imati upravo tu metodu, ona obavlja s metodom

prilagodbu

s obi£nog £ita£a na £ita£

3 Dijagram sa slike 8.2 nije sasvim korektan jer se ista klasa ne bi smjela crtati dvaput;
mežutim, ispravan crteº ne bi bio tako jasan.

118

POGLAVLJE 8.

UZORCI U DIZAJNU KODA

Client o e kuje ovakav objekt Client +readInput() Reader +read() +close() Decorator Ovakav objekt imamo

DebugReader +read() +close()

Reader +read() +close()

Slika 8.2: UML-ov dijagram uzorka

Decorator

č

Quick x je tu samo da taj postupak automatizira. R. Npr. Po- Quick x aktivira se kombinacijom tipaka Ctrl-1 ili iz menija javit ¢e se mali prozor£i¢ u blizini kursora i ponudit ¢e razli£ite mogu¢nosti prepravljanja koda. ako se kursor nalazi na mjestu gdje je otkrivena pogre²ka. Opcija je dostupna i izravno pomo¢u Ctrl2. Ako nasumice slu²ate savjete Quick x -a. imamo varijablu ƒtring s sF i zapo£injemo novi redak koda tipkaju¢i 119 . Ponudit ¢e se sve metode denirane za objekt lijevo od to£ke. najvjerojatnije je da ¢ete napraviti kaos u svom kodu. Opciju koristimo uvijek kad ºelimo promijeniti ime nekoj lokalnoj varijabli. i dodatno. Ovdje ¢e se Edit. Content assist aktivira se pomo¢u Ctrl-Space ili iz menija Edit. privatnom atributu/metodi i op¢enito bilo kojem identikatoru koji se koristi samo u trenutnoj datoteci.Poglavlje 9 Savjeti za rad u Eclipse -u 9. standardne na£ine njenog otklanjanja. PreEdit. Njihovim kori²tenjem kod se kreira brºe (puno manje tipkanja) i pouzdanije ( poru£a se detaljno prou£avanje menija spomenuti nekoliko najvaºnijih alata.1 Automatizacija rada na kodu Eclipse ima dosta bogatu zbirku alata koji automatizi- Razvojno okruºje raju mnoge aktivnosti na razvoju koda. Treba imati na umu ovo: ukloniti pogre²ku. Source i Refactor. Eclipse ne radi tipfelere). Koristi se npr. Quick x ne zna bolje od vas! Student mora ve¢ znati kako treba Rename in le je jedna od opcija koje nudi Quick x kad smo s kursorom unutar nekog identikatora. na mjestu gdje ºelimo otipkati ime metode koju pozivamo.

Po- cuje deklaracija metode equ—ls. U ¢e se popis svih ranijih verzija datoteke koje su zapam¢ene. Eclipse ¢e se pobrinuti da sva pozivanja na ono ²to se seli budu Pomo¢u izmijenjena na odgovaraju¢i na£in. odnosno upozorit ¢e nas ako postoji prepreka preseljenju. Odaberemo pravu i njeno ime se ubacuje Eclipse odgovaraju¢e pode²en. Ako je ƒtring. koji se trenutno ne koriste u kodu. Source. moºemo Package Explorer-u kliknemo desnim gumbom na na²u datoteku i odaberemo Replace with. paketu. Time se ubatoƒtring. Dostupno iz menija Refactor ili pomo¢u Alt-Shift-R. moodabrati  equals. SAVJETI ZA RAD U ECLIPSE-U U ovom trenutku koristimo Ctrl-Space i uz kursor pojavljuje se popis svih metoda deniranih za u kod. m—in. Local history. Isto radi i za sebno koristan je predloºak konstrukciju sysout koji ubacuje £esto kori²tenu a duga£ku Takožer su vrlo korisni predlo²ci ƒystemFoutFprintln@AY for  standardne petlje za prolazak po elementima polja ili kolekcije.120 POGLAVLJE 9. Organize imports aktivira se pomo¢u Ctrl-Shift-O ili iz menija Kad god se pojavi pogre²ka da je neka vrsta podatka nepoznata. . kodnih predloºaka : npr. Popis svih predloºaka moºe se pregledati i editirati pod Window. Pomo¢u Rename moºemo promijeniti ime klasi. Ako postoji vi²e vrsta istog imena. Dostupno iz menija Refactor ili pomo¢u Alt-Shift-V. izbornik Content Assist -a pojavit ¢e se i sam od sebe ako otipkamo to£ku i pri£ekomo koju sekundu (ovisno o brzini ra£unala). h—shgode. javnoj metodi i op¢enito bilo kojem identikatoru koji se koristi u vi²e datoteka. Ova komanda takožer i uklanja nepotrebne uvoze. Move moºemo klasu preseliti u drugi paket i metodu/atribut u drugu klasu. Content assist ºemo natipkati koristi se i za ekspanziju pritisnuti Ctrl-space i eq. Java. Pojavit se vratiti na ranije stanje datoteke. Preferences. Ovom naredbom automatski se pronalaze i uvoze sve potrebne vrste. Templates. 9. Editor.2 Povijest datoteke Ako shvatimo da smo krenuli s razvojem klase u pogre²nom smjeru. pojavit ¢e se prozor u kojemu treba odabrati pravu. to je najvjerojatnije stoga ²to doti£na vrsta nije uvezena.

3. Ono ¢e tipi£no biti bez datoteka.. ponovo u kazalo tamo²njeg krenuti Workspace -a.3 9. Projekt je prili£no jednostavno preseliti. na svom laptopu. cija paketa u datoteci (npr. Project. po- Eclipse i pomo¢u File. Ono ²to je zaista trebalo napraviti je popraviti korijenski direktorij izvornog koda.1 Seljenje projekta s ra£unala na ra£unalo Tipi£an problem prilikom selidbe Studenti se redovito susre¢u s potrebom da svoj projekt razvijaju na vi²e ra£unala  u labosu. samo s potkazalom hr.. Student odlazi na Quick x koji mu nudi izmjenu imena paketa u sr™FhrFferFtel i time malu pogre²ku pretvara u puno ve¢u. Tamo se nalazi okvir naslovljen  Source folders on build path i unutra bi trebao biti navedeno kazalo sr™. pogotovo stoga ²to je na raspolaganju £itav niz postupaka. To se obavlja u Project. Source. Op¢enito je dovoljno kazalo projekta preseliti na drugo ra£unalo. Java Project zatraºiti stvaranje . U tom kazalu za svaki projekt postoji po jedno koje kazalo potkazalo istog imena kao projekt. ali jo² je jednostavnije to izvesti pogre²no. Eclipse se sada ºali da deklara- hrFferFtel  ²to je ispravno) ne odgovara kazalu u kojem se nalazi (sr™GhrGferGtel  ²to je neispravno!). uo£ena je sljede¢a tipi£na pogre²ka: 1. na ku¢nom ra£unalu itd. Problemi nastaju zbog toga ²to postupak izvoza projekta nije usklažen s postupkom uvoza.2 Savjeti za uspje²nu selidbu Sve datoteke projekta nalaze se na jednom mjestu. sr™ ne prosr™ 2. To po- navlja za svaku datoteku. Projekt se ispravno izveze tako da glavno kazalo projekta sadrºi kazalo sr™ koje je korijensko za datoteke s izvornim kodom. Na odredi²nom ra£unalu projekt se uveze tako da se kazalo gla²ava korijenskim. New. SAVJETI ZA RAD U ECLIPSE-U 121 9.3. 9. Ako nije.POGLAVLJE 9. ve¢ glavno kazalo projekta. Posebice. dodajemo ga pomo¢u tipke Add folder. Tako ispada da je ustvari prvi segment imena paketa. 3. Switch Workspace. Java Build Path. Properties. To se moºe doznati putem File. Potrebno je samo znati Eclipse koristi kao svoj Workspace.

zatim Export. nudi nam se mogu¢nost detaljnog odabira da- 2. Datoteke F™l—ssp—th i Fproje™t sr™. Archive le Next.). Eclipse ¢e vas obavijestiti (u dnu dijalo²kog prozora) da kazalo tog imena ve¢ postoji i da ¢e sve postavke projekta biti preuzete. Pritiskom na Stvorenu arhivu dopremamo do odredi²nog ra£unala na kojem pokre¢emo Eclipse 1. 2. Import. U Package Explorer-u koristimo desni klik nad na²im projektom. Eclipse nudi i izravnu podr²ku za selidbu projekta. . Niºe u dijalo²kom prozoru pomo¢u Browse odaberemo to£nu lokaciju i ime arhive koja ¢e se stvoriti. Provjerimo da je ime projekta ispravno i ozna£eno kva£icom. Finish izdajemo naredbu za stvaranje arhive. U dijalo²kom prozoru odabiremo opciju Select archive le i pomo¢u Browse nalazimo svoju arhivu. U dijalo²kom prozoru pojavljuje se popis svih projekata naženih u arhivi (trebo bi biti samo jedan). 4.122 POGLAVLJE 9. Provjerimo da su odabrane opcije Save in zip format i Create directory structure for les. Existing projects into Workspace. Ako je bitno da arhiva bude ²to manja (mejl i sl. 3. Pritiskom na Finish izdajemo naredbu za uvoz projekta. Na izvori²nom ra£unalu radimo ovo: 1. SAVJETI ZA RAD U ECLIPSE-U projekta istog imena. Kad pritisnemo toteka za izvoz. obvezno zadrºimo (tu su postavke projekta). i zatim: File. moºemo izbaciti sva potkazala osim 3. kori²tenjem naredbi Export/Import.

and Alison Huml. The Java Language Environment. [5] James Gosling and Henry McGilton. [2] Mary Campione.com/docs/books/tutorial.sun. The Java Tutorial.0/docs/api.sun. http://java. http://java. and Gilad Bracha. Guy Steele.0 API Specication. Bill Joy. and John Vlissides. [3] Erich Gamma. Addison-Wesley Professional.html.sun.sun. Ralph Johnson. Design Patterns. http://java. 1995.doc. http://java. 123 .5.Literatura [1] Java 2 Platform Standard Edition 5. Richard Helm.com/docs/books/jls/third_edition/html/j3TOC. [4] James Gosling. 2005.html. The Java Language Specication. chapter 6: Security in Java.com/j2se/1. Kathy Walrath.com/docs/white/langenv/Security.