Poglavje 4
Strukturiranje kode

Med izvajanjem programa se programski stavki izvajajo v natančno določenem vrstnem redu. Ta je odvisen od poteka izvajanja, od vrednosti prebranih podatkov, od uporabnikovih ukazov in drugih pogojev. Pri večjih programih je število izvršenih programskih stavkov zelo veliko (tudi do več 100 tisoč). Zelo težko (oziroma skoraj nemogoče) bi bilo vse stavke večjega programa napisati preprosto enega za drugim - zaporedje bi bilo zelo dolgo, nepregledno, možnost napake bi bila zelo velika, vzdrževanje kode pa zelo zahtevno.


images/program.eps


Slika 4.1: Nivoji strukturiranja kode


Kodo večjih programov obvladamo s t.i. strukturiranim programiranjem na mikro in makro nivoju. Mikro nivo strukturiranega programiranja predstavljajo preprosti programski konstrukti, ki omogočajo vejitve in zanke (stavka if-else in switch, operator ?: ter zanke for, while in do). Na višjem nivoju pa se koda združuje v metode, te so del razredov, več razredov pa tvori paket; celoten program je sestavljen iz enega ali več paketov (glej sliko 4.1). V tem poglavju si bomo najprej ogledali osnovne konstrukte mikro nivoja, nato se bomo osredotočili na pomen metod, razredov in paketov na makro nivoju. Pri tem se bomo omejili na statični (t.j. ne-predmetni) nivo programiranja, saj je predmetno programiranje tako pomemben koncept, da mu je namenjeno samostojno poglavje.

4.1 Zanke do, while in for

Zanke do, while in for uporabljamo za ponavljanje zaporedja programskih stavkov, dokler ni izpolnjen izstopni pogoj. Kadar je ta pogoj vezan na nek števec, običajno uporabljamo for zanko, če ni, pa do ali while zanko. Spodnji primer prikazuje uporabo vseh treh zank za rešitev istega problema: 10-kratno izvajanje zaporedja programskih stavkov.

 

int i=0;       | int i=0;        | int i; 
do {           | while (i<=10) { | for (i=1;i<=10;i++) { 
  i=i+1;       |   i=i+1;        |   .... 
  ....         |   ....          | } 
} while (i<10) | }               |

V povezavi z zankami uporabljamo tudi ukaza continue in break. Z ukazom continue dosežemo začetek izvajanja naslednje iteracije zanke. Ukaz break prekine izvajanje zanke, program se nadaljuje v prvem programskem stavku, ki sledi zanki.

4.2 Vejitveni stavki if-else

Vejitveni stavek if-else se uporablja, kadar je tok programa (kateri stavki se izvršijo in kateri ne) odvisen od nekega logičnega pogoja.

 

if (a==1)   |   if (x==5) {    |   if (q<5) { 
  b=1;      |     c=1;d=3;     |     d=3; 
            |   } else {       |   } else if (q<2) { 
            |     c=4;         |     d=2; 
            |   }              |   } else { 
            |                  |     d=1; 
            |                  |   }

Kadar želimo, da se v primeru izpolnjenega pogoja pogoj izvrši stavek1, v nasprotnem primeru pa stavek2, napišemo: if (pogoj) stavek1; else stavek2;. Če vejitev vključuje več stavkov, uporabimo blok { ... }, kot vidimo v zgornjih primerih.

4.3 Stavek switch

Namesto zaporedja več if-else stavkov lahko uporabimo stavek switch. Če želimo v spremenljivko b shraniti a-to potenco števila 3 (za a 4) in 0 sicer, to lahko storimo z uporabo if-else takole:

 

if (a==1) 
  b=3; 
else if (a==2) 
  b=9; 
else if (a==3) 
  b=27; 
else if (a==4) 
  b=81; 
else 
  b=0;

z uporabo switch pa takole:

 

switch (a) { 
  case 1:  b=3;   break; 
  case 2:  b=9;   break; 
  case 3:  b=27    break; 
  case 4:  b=81;   break; 
  default: b=0;    break; 
}

Naloga 4-I. Napiši metodo String opisOcene(int ocena), ki kot parameter prejme številčno oceno in vrne njen opis ( “Odlicno” za 10, “Prav dobro” za 9, ....).  

Nalogo lahko rešimo vsaj na dva načina: z večkratno uporabo stavkov if-else (bralec naj nalogo na ta način reši za vajo) ali z uporabo stavka switch.

Izpis opisa za oceno strukt/SwitchOcena.java

 

Zelo pomembno: pri uporabi stavka switch moramo biti posebej pozorni na naslednje dejstvo: ko program enkrat “vstopi” v izvajalni del switch stavka (desno od dvopičja pri enem od ukazov case), ga samodejno ne zapusti več. Ker v večini primerov tega ne želimo, je naloga programerja, da ob koncu kode, ki pripada posameznemu veji stavka switch, doda ukaz break (glej vrstice 8 do 12 v kodi programa strukt/SwitchOcena.java).

V nekaterih primerih (čeprav so ti res bolj redki), pa lahko pravkar opisano naravo ukaza switch uporabimo za elegantnejšo rešitev problema. Oglejmo si primer take uporabe.

Naloga 4-II. Napiši metodo steviloDni(int dan, int mesec), ki vrne število dni, ki so minili od začetka leta do dneva dan.mesec.  

Rešitev naloge 4-II.: Število pretečenih dni strukt/SwitchSteviloDni.java

 

Naloga 4-III. Napiši program, ki izpiše črke slovenske abecedu (brez č, š in ž), kot je prikazano spodaj.

                              A! b* c* d*  
                              E? f* g* h*  
                              I& j* k* l*  
                              m* n* O# p*  
                              r* s* t* U/  
                              v* z*

 

Ker so znaki in števila v računalniku močno povezani (spomnite se ASCII tabele), lahko za rešitev naloge uporabimo zanko, v kateri števec teče od ’a’ do ’z’. Pri izpisu posamezne črke c upoštevamo naslednje:

Rešitev naloge 4-III.: Izpis črk abecede strukt/SwitchAbeceda.java

 

4.4 Metode

Podobno kot v drugih programskih jezikih se tudi pri javi koda na osnovnem nivoju združuje v metode – vsa koda programa je združena v eni ali več metodah. Preprosti programi premorejo le main() metodo, zahtevnejši pa jih imajo več. Čeprav je teoretično mogoče vsak program napisati v eni sami metodi, je priporočljivo, da ga razbijemo na več manjših. Manjše dele programa je namreč lažje vzdrževati kot enega velikega, poleg tega lahko posamezne metode uporabimo večkrat in to celo v različnih programih (brez uporabe metod bi morali namesto tega večkrat uporabljeno kodo pisati vsakič znova). Metoda v jeziku java je na nek način podobna matematični funkciji (črna škatla, ki prejme parametre in vrne rezultat) a jo lahko razumemo tudi splošneje kot samostojen manjši program. Poleg rezultata, ki ga metoda vrne, ima ta lahko tudi stranske učinke (izpis na zaslon, sprememba katere od globalnih spremenljivk, poseg v sistemske vire, ...). Osnovni podatki o funkciji (ime ter spisek in tip parametrov) se imenujejo podpis metode.

V nadaljevanju tega poglavja se bomo ukvarjali le s statičnimi metodami, torej z metodami, ki jih lahko kličemo iz statičnega konteksta (recimo iz metode main()). Pomenu in načinu uporabe dinamičnih metod (torej tistih brez določila static v glavi) se bomo posvetili v poglavju o predmetnem programiranju.

Primer preproste metode je prikazan na spodnjem primeru.  

  static double sredina(double x, double y) { 
    return (x+y)/2 
  }

Iz podpisa metode razberemo naslednje: metoda z imenom sredina prejme dva parametra tipa double in vrne rezultat, ki je prav tako tipa double. V telesu metode (t.j. znotraj zavitih oklepajev) je koda, ki pripada tej metodi. Tako kot večina metod (izjeme so tiste, ki ne vračajo rezultata, oziroma void metode), metoda sredina vrne rezultat z uporabo stavka return.

4.4.1 Preoblaganje metod

V javi lahko obstaja več metod z istim imenom in z različnim številom in/ali tipom parametrov. Če ima neka metoda več različnih oblik (je deklarirana z različnim številom oziroma tipom parametrov), rečemo, da je metoda preobložena (angl. overloaded method). Preobložene metode so lahko povsem samostojne (vsaka različica metode z istim imenom naredi nekaj drugega) ali pa so med seboj povezane tako, da metoda z manjšim številom parametrov kliče istoimensko metodo z večjim številom parametrov, pri čemer manjkajoči parameter nadomesti s privzeto prednostjo.

Primer preobložene metode strukt/Preoblaganje.java

 

V zgornjem primeru je preobložena metoda izpisi() deklarirana na tri načine: s tremi parametri, z enim parametrom in brez parametra. Metoda izpis(String), ki je deklarirana z enim parametrom, manjkajoča parametra x in y nadomesti s privzetimi vrednostmi in kliče metodo s tremi parametri takole izpisi(0,0, napis).

Naloga 4-IV. Napiši program, ki izpiše vsoto prvih dveh argumentov (glej nalogo 2-VI). Program naj NE uporablja nobene vgrajene metode za pretvorbo niza v število.  

Postopek za pretvorbo bomo morali napisati sami: v zanki se bomo “sprehodili” čez števke podanega števila in na vsakem koraku izračunali novo delno vsoto (prejšnjo delno vsoto bomo pomnožili z deset in prišteli novo števko), kot prikazuje slika.

images/racun.eps

Upoštevati moramo še, da so argumenti programa nizi, torej zaporedja znakov, postopek na zgornji sliki pa pri računanju uporablja števke (na primer, prvi element tabele na sliki je 1 in ne ’1’). Da bo torej vse potekalo prav, moramo znake niza sproti pretvoriti v števke. To bomo storili preprosto tako, da bomo upoštevali dejstvo, da v javi z znaki lahko računamo. Velja, na primer, ’3’-’0’ == 3, saj v znakovni aritmetiki velja, da je znak ’3’ za tri oddaljen od znaka ’0’. V splošnem torej velikost števke dobimo tako, da od njene znakovne predstavitve odštejemo znak ’0’.

Rešitev naloge 4-IV.: Računanje vsote strukt/Racunalo2.java

 

V programu smo morali pretvorbo med nizom in številom izvesti dvakrat (vrstice 10-15 in 17-22), zato smo tudi kodo za pretvorbo napisali dvakrat. Z uporabo metod se takemu podvajanju lahko ognemo. V razredu pred metodo main() napišimo metodo int nizVStevilo(String stevilka) in v njej napišemo kodo za pretvorbo. V metodi main() metodo nizVStevilo() kličemo podobno, kot smo v programu osnove/Racunalo.java klicali metodo Integer.parseInt(); edina razlika je v tem, da nam pri klicu metode nizVStevilo() ni potrebno navesti imena razreda, saj se metoda nahaja znotraj istega razreda.

Rešitev naloge 4-IV. (popravljeno): Računanje vsote strukt/Racunalo3.java

 

Naloga 4-V. Napiši metodo jePrastevilo(int x), ki vrne true, če je podano število praštevilo, in false sicer. S pomočjo te metode izpiši vsa praštevila iz intervala [spMeja, zgMeja]. Meje intervala preberi iz tipkovnice.  

Preden se lotimo reševanja naloge, poglejmo nekaj matematičnih dejstev o praštevilih:

Preverjanje bomo izvedli s pomočjo for zanke; izvajanje bomo končali, ko bomo našli delitelj števila x oziroma, ko bomo prišli do √x--.

Rešitev naloge 4-V.: Izpiše vsa praštevila iz danega intervala strukt/Prastevila.java

 

4.5 Program v več razredih

Čeprav smo v primerih, ki smo jih srečali do sedaj, vso programsko kodo pisali v enem razredu (v najboljšem primeru smo jo razbili v več metod), to ni najboljša praksa. No, v naših primerih, ki so bili vsi zelo kratki, je to povsem v redu, kadar pa so programi malo daljši, je razdelitev kode v več razredov nujno potrebna, saj le tako dobimo pravilno strukturiran program, ki je hkrati pregledan in funkcionalen. V enem razredu običajno združimo kodo, ki po (funkcionalni) logiki spada skupaj. Tako bo, na primer, računovodski program vseboval več razredov, enega za glavno knjigo, enega za računanje potnih nalogov, enega za delo z uporabniki in tako naprej. V nalogi 4-VI bomo napisali program v dveh razredih in pokazali, kako poteka sodelovanje med njima (kako iz enega od njih kličemo metodo, ki je napisana v drugem).

Naloga 4-VI. Napiši program za preprosto kodiranje besedila. Natančneje: napiši metodi String kodiraj(String niz) in String odkodiraj(String niz), ki zakodirata in odkodirata podano besedilo, ter program za preizkus delovanja teh metod. Metodi naj bosta napisani v enem razredu, glavni program pa v drugem.  

Kodiranja se lahko lotimo na več načinov, mi bomo izbrali najpreprostejšo možnost. Besedilo bomo zakodirali tako, da bomo kodirali posamezne znake po spodnji tabeli:

Originalna crka: A B C D E F G H ... V W X Y Z  
Zakodirana crka: D E F G H I J K ... Y Z A B C

Kodiramo torej tako, da posamezni črki prištejemo konstanten zamik (v zgornjem primeru 3). Pri tem se kaj kmalu lahko zgodi, da pademo ven iz obsega črk (če je A+1==B, kaj je potem Z+1?). Težavi se ognemo tako, da operacijo zamikanja izvajamo po modulu 26 (toliko je črk angleške abecede). Omenimo še eno težavo, na katero naletimo: ko izvajamo znakovno aritmetiko, pravzaprav računamo s števili, zato je rezultat računa število. Števila pa ne moremo “stlačiti” v spremenljivko tipa char. Pravzaprav bi to lahko storili, saj vemo, da številka, ki jo dobimo pri izračunu, predstavlja nek znak (kar v splošnem ni res!). Treba je sporočiti prevajalniku, da vemo, kaj delamo. To pa storimo z eksplicitno navedbo tipa (angl. type casting) – (char) na začetku vrstice.

 

// kodiranje (originalni znak -> kodiran znak) 
kZnak = (char) (A + (oZnak -A + zamik) % 26);

Odkodiranje poteka v obratni smeri in sicer tako, da črkam odštevamo isti zamik.

 

// odkodiranje (kodiran znak -> originalni znak) 
oZnak = (char) (A + (26 + kZnak - A - zamik) % 26);

V razredu strukt/Kodiranje.java napišemo metodi kodiraj() in odkodiraj(). V tem razredu ne potrebujemo metode main, saj to ni glavni razred (program) ampak le pomožni razred, katerega metode bomo klicali iz glavnega programa.

Metode za kodiranje in dekodiranje strukt/Kodiranje.java

 

Glavni program (strukt/Tajno.java) prebere niz in ga zakodira in odkodira ter vse rezultate izpiše na zaslon. Metodi za kodiranj in dekodiranje sta napisani v drugem razredu, zato je treba pri klicu to jasno navesti (strukt.Kodiranje.kodiraj()).

Rešitev naloge 4-VI.: Kodiranje in dekodiranje besedila strukt/Tajno.java

 

Ker je program pisan v dveh datotekah, je treba pred začetkom izvajanja programa prevesti obe. Za pravilno izvajanje programa Tajno potrebujemo razreda Tajno.class in Kodiranje.class, kar ugotovi že prevajalnik sam in bo prevajanju razreda Tajno avtomatsko prevede še razred Kodiranje. Pri distribuciji programa (če ga prenesemo na drug računalnik) je treba poskrbeti, da se bosta prenesli obe datoteki. Če namreč prenesemo samo glavni program, bomo ob zagonu dobili naslednjo napako.

Napaka ob izvajanju, če manjka razred Kodiranje.class
[user@localhost]# java Tajno 
Vpisi niz: TEST 
Exception in thread "main" 
          java.lang.NoClassDefFoundError: Kodiranje 
        at Tajno.main(Tajno.java:10) 
Caused by:java.lang.ClassNotFoundException:Kodiranje

Pri tem je zanimivo, da se program Tajno začne izvajati, napako pa javi šele takrat, ko se v kodi dejansko kliče metoda kodiranje().

4.6 Paketi

Najvišji nivo strukturiranje kode je združevanje razredov v pakete.

Namen.
Pakete uporabljamo za smiselno združevanje sorodnih razredov v celoto. V paketu je lahko en ali več razredov in podpaketi. Z uporabo paketov se ognemo težavam, ki lahko nastanejo pri poimenovanju razredov (dva razreda z istim imenov). V enem paketu NE moremo imeti dveh istoimenskih razredov; lahko pa sta v dveh različnih paketih. Ko podamo celotno ime razreda (vključno z imenom paketa), do zamenjave ne more priti.
Obstoječi paketi.
Java s seboj prinaša mnogo paketov, kot na primer: java.applet, java.awt, java.io, java.lang, ... Poleg tega lahko pakete v obliki jar datoteke prenesemo iz interneta ali drugega vira, lahko pa ustvarimo tudi svoje.
Ime paketa.
Paket poimenujemo smiselno glede na namen. Tako se bo paket, v katerem bodo definirane trigonometrične funkcije imenoval (na primer) trig. Paket uvrstimo na “primerno” mesto v direktorijski strukturi. Na zgornjem nivoju te strukture je običajno ime podjetja - uporablja se internetno ime v obratnem vrstnem redu (primer: če smo razvijalec v podjetju bestsoftware.com bomo pakete hranili v mapi com/bestsoftware).

Primer: pakete hranimo v mapi si/fri, v njej so podmape: math (paketi za matematiko), datoteke (paketi za delo z datotekami), .... V posamezni mapi imamo lahko razrede in/ali pakete (podmape). V našem primeru imam v mapi math dve podmapi (geometrija in trigonometrija), v teh mapah pa štiri datoteke (glej spodnjo sliko).

si  
‘--fri  
   |-- math  
   |   |-- geometrija  
   |   |   |-- Kvadrat.java  
   |   |   ‘-- Trikotnik.java  
   |   ‘-- trigonometrija  
   |       |-- Cosinus.java  
   |       ‘-- Sinus.java  
   ‘-- datoteke  
        ‘-- BranjePodatkov.java  

Do razreda Kvadrat.java dostopamo na dva načina: tako, da navedemo celotno ime (si.fri.math.geometrija.Kvadrat) ali pa tako, da na začetku programa paket geom uvozimo (ukaz import si.fri.math.geometrija.*), potem pa se sklicujemo samo na ime razreda Kvadrat.

 

import si.fri.math.geometrija.*; 
 
public class Test { 
  public static void main(String args[]) { 
 
    // Kvadrat poznamo, saj smo uvozili celoten paket 
    new Kvadrat(); 
 
    // uporabimo celotno ime, saj paketa si.fri.math.trigonometrija nismo uvozili 
    new si.fri.math.trigonometrija.Cosinus(); 
  } 
}
Uporaba paketov
Če želimo uporabljati nek razred, ki ni v ”našem” paketu moramo ta razred uvoziti (import). Na primer: če potrebujemo razred Random, moramo napisati import java.util.Random. Če tega ne bi napisali, bi ob ukazu new Random() prevajalnik izpisal napako.

Druga možnost (če se želimo izogniti ukaza import) je, da pri uporabi razreda napišemo njegovo celotno ime. Primer:

   java.util.Random r = new java.util.Random();

V tem primeru uvoza ne potrebujemo.

Avtomatski uvoz paketa java.lang.
Kritičen bralec se bo ob tem verjetno vprašal, če to pravilo vedno drži. Vemo namreč, da ni pravila brez izjeme, zato je vprašanje povsem na mestu, še posebej ob upoštevanju dejstva, da lahko kljub temu, da je, na primer, razred Math v paketu java.lang napišemo double pi = Math.PI;, ne da bi prej razred Math uvozili. Je torej to izjema omenjenega pravila? Odgovor je oboje, ne in da. Gre namreč za izjemo pravila, vendar ne tega pravila, ampak pravila, ki pravi, da je treba vse pakete pred uporabo uvoziti. Paketa java.lang namreč ni potrebno uvoziti, saj ga java v vsakem primeru uvozi sama (to je edini paket, ki se avtomatsko uvozi). Paket, v katerem je razred Math je torej že uvožen, zato lahko ta razred uporabljamo, ne da bi ga sami uvozili.
Statičen uvoz
Če želimo uporabiti nek atribut ali neko metodo razreda, moramo obvezno podati ime razreda, v katerem je ta atribut ali ta metoda deklariran. Tako moramo za uporabo števila PI napisati Math.PI, za uporabo metode sinus pa Math.sin(). Temu se lahko izognemo tako, da na začetku programa napišemo

   import static java.lang.Math.*;

Potem se v naš razred uvozijo vse statične metode in vsi statični atributi razreda Math in lahko jih uporabljamo brez navedbe razreda takole:

   System.out.printf("Pi=%.10f", PI);

Zaradi mnogih negativnih posledic, ki jih ima statičen uvoz, njegovo uporabo mnogi zelo odsvetujejo, zato se bomo temu skušali izogniti tudi mi.

Uporaba razredov, ki so del paketa

Za nemoteno delovanje programa, mora biti pot do vrha paketne strukture (v našem primeru do mape, ki vsebujem mapo si) v zapisana v okoljski spremenljivki CLASSPATH. Pri uporabi integriranih razvojnih okolij (npr. NetBeans) za to avtomatsko poskrbi okolje, v ostalih primerih mora pot nastaviti uporabnik. Oglejmo si primer izvajanja razreda si.fri.math.geometrija.Trikotnik na več načinov: z in brez uporabe spremenljivke CLASSPATH. V primeru predpostavljamo, da se razred Trikotnik.java nahaja v mapi D:\programi\si\fri\math\geometrija

si/fri/math/geometrija/Trikotnik.java

 

si/fri/math/geometrija/Kvadrat.java

 

si/fri/math/trigonometrija/Sinus.java

 

si/fri/math/trigonometrija/Cosinus.java

 

si/fri/testmath/TestMath.java

 

4.7 Dostopnostna določila

Java pozna štiri dostopnostna določila (angl. access modifiers), ki omogočajo omejevanje dostopa do spremenljivk, metod in razredov. Več bomo o določilih spoznali v poglavju o objektnem programiranju, na tem mestu določila le naštejmo in na kratko opišimo njihov pomen.

Določilo Pomen


public

dostopno povsod in vsakomur


protected

dostopno v vseh razredih tega paketa ter v vseh podrazredih (tudi, če niso v tem paketu)


default (brez določila)

dostopno v vseh razredih tega paketa


private

dostopno samo v tem razredu

 

Pomen in način uporabe določil je opisan v komentarjih spodnjih programov.

Naloga 4-VII. Napiši razrede G1, G2, G3, Test in ETest, kot prikazuje spodnja slika. V razredu G1 deklariraj spremenljivke z različnimi dostopnostimi določili, v ostalih razredih pa preveri njihovo dosegljivost.  

‘-- si  
    |-- fri  
    |   |-- dolocila  
    |   |   |-- G1.java  
    |   |   ‘-- G2.java  
    |   |   ‘-- G3.java  
    |   | -- testdolocil  
    |   |   |-- Test.java  
            ‘-- ETest.java

si/fri/dolocila/G1.java

 

si/fri/dolocila/G2.java

 

si/fri/dolocila/G3.java

 

si/fri/testdolocil/Test.java

 

si/fri/testdolocil/ETest.java

 

4.8 Komentarji in java dokumentacija

Zelo pomembno je, da je programska koda ČITLJIVA! K čitljivosti pripomorejo:

O imenovanju in zamikih preberite na
    http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

Pomemben del vsakega programa so tudi komentarji. Programer jih uporabi tam, kjer se mu zdi, da je koda nerazumljiva in je potrebna dodatna razlaga v “človeskem” jeziku. Komentarjev ne sme biti niti preveč niti premalo! Komentar je del javanske kode, ki jo prevajalnik ignorira. Lahko je sestavljen iz poljubnih veljavnih Unicode znakov (tudi ČŠŽ).

Java pozna tri tipe komentarjev:



// komentar
enovrstični komentarji; komentar je vse od znaka // dokonca vrstice


/* komenar */
večvrstični komentarji; komentar je vse, kar je ujeto med znaka /* in */


/** komantar */
komentar za dokumentacijo (angl. doc comments); tak komentar se pojavi tik pred deklaracijo metode ali razreda in se uporablja za avtomatsko generiranje dokumentacije;


 
Spodnji primer prikazuje javansko kodo, v kateri sta enovrstični in večvrstični komentar.

 

   double stevec; // inicializacija v tem primeru ni potrebna 
 
   // izracunamo povprecje ocen studentov FRI 
   stevec = izracunajPovprecje(); 
 
   /* Za izpis bomo uporabili metodo printf, ki omogoca 
      izpis realnega stevila na podano stevilo decimalk 
      (v nasem primeru: izpisemo na dve decimalki natancno) 
   */ 
   System.out.printf("Povprecnaocena:\%.2f", stevec);

4.8.1 Dokumentacijski komentarji

Java omogoča avtomatsko generiranje dokumentacije na podlagi izvorne kode in dokumentacijskih komentarjev. Znotraj dokumentacijskega komentarja se lahko uporabijo naslednje značke (angl. tags):



Značka primer uporabe


@see
Povezave v rubriki ”Glej tudi”


{@link}
Hiperpovezave med opisnim besedilom


@param
Opis parametrov metode


@return
Opis rezultata metode


@throws
Opis izjem, ki jih lahko vrze metoda


@author
Opis avtorja metode


@version
Stevilka verzije


 

Naloga 4-VIII. Napiši program, ki n-krat izpiše “Pozdravljen, ime” (ime in n sta prvi in drugi argument ob klicu programa). V programu uporabi različne načine komentarjev (enovrstični, dvovrstični, dokumentacijski). Poženi ukaz javadoc in poglej rezultat (html kodo s komentarji).  

Rešitev naloge 4-VIII.: Java dokumentacija komentar/Pozdrav.java