Java:Funktsioonid
Programmi koodi saab jagada osadeks. Osa koosneb grupeeritud käskudest, millele antakse nimetus. Kui kuskil programmis on vastavaid käske vaja kasutada, saab välja kutsuda nimeliselt eelnevalt grupeeritud koodiosa.
Funktsioonid jagunevad kaheks:
- ühed, mis tagastavad mingi väärtuse (neid nimetatakse funktsioonideks)
- teised, mis ei tagasta väärtust (neid nimetatakse vahel protseduurideks)
Tegelikult võib mõlemat tüüpi funktsiooni kohta öelda lihtsalt "funktsioon" või Javas ka "meetod". Seega, neid termineid kasutatakse segamini. Pigem sisu järgi saab vahet teha, mistüüpi funktsiooni/meetodiga tegemist on.
Mõned näited matemaatilistest funktsioonidest:
Math.sqrt(x);
- tagastab etteantud argumendi ruutjuureMath.random();
- tagastab juhusliku arvu vahemikus [0..1)
Funktsiooni defineerimine:
[laiendid] [tagastus-tüüp] [funktsiooni-nimi] ([parameetrite nimekiri]) { [käsud] }
Laiendeid võib olla mitu või võivad üldse puududa. Need on peamiselt olulised siis, kui hakkame objekt-orienteeritud koodi kirjutama.
Parameetrite nimekiri on komaga eraldatud argumentide nimed koos tüübiga. Kui funktsioon välja kutsutakse, tuleb sellised argumendid kaasa anda. Oluline on, et kaasaantud argumentide tüübid oleksid täpselt samad, nagu funktsioon eeldab. Funktsiooni sees on parameetrid nagu deklareeritud muutujad. Alloleva näite puhul deklareeritakse double-tüüpi muutuja x ja y, mille väärtus määratakse sellel hetkel, kui funktsioon väja kutsutakse. Kogu funktsiooni ulatuses {} märkide vahel on need funktsioonid kättesaadavad.
Funktsioon, millel on määratud tagastusväärtus (allpool olev funktsioon tagastab boolean väärtuse), saab seda teha käsuga:
return [avaldis];
Funktsioon lõpetab oma töö ära peale "return" käsku.
Näiteks: <source lang="java"> public static boolean lessThan(double x, double y) { return x < y; } </source>
Hiljem koodis saab sellise koodi asemel:
<source lang="java"> // ...
boolean b1 = 5.0 > 6.0;
boolean b2 = 10.0 < 5.0; </source>
kirjutada nii:
<source lang="java"> boolean b1 = lessThan(6.0, 5.0); boolean b2 = lessThan(10.0, 5.0); </source>
Return käske võib funktsioonis olla mitu. See võib esineda ükskõik kus (ei pea funktsiooni lõpus olema). Täpselt üks return käsk käivitatakse, et funktsiooni väärtus tagastada (kuna peale esimese käivitamist lõpetab funktsioon oma töö, teise käsuni ei jõuta).
Näiteks: <source lang="java"> static intnextN(int currentN) { if(currentN % 2 == 1) // test if current N is odd return 3 * currentN + 1; // if so, return this value else return currentN/ 2; // if not, return this instead } </source>
Funktsioonide dokumenteerimine (JavaDoc)
JavaDoc on dokumentatsiooni genereerimise tööriist, mis kasutab kommentaare koodist, et genereerida dokumentatsioon ehk "juhend".
Näiteks funktsiooni JavaDoc:
<source lang="java"> /**
* Calculates the length of the hypotenuse for the right triangle * with the side lengths a and b. * @param a The length of one side * @param b The length of other side * @return The length of the hypotenuse */
double pythagoras(double a, double b) { ... </source>
JavaDoc funktsioonidele:
- algab /** sümbolitega
- iga järgmie rida algab *-ga
- esimene lause on lühike kokkuvõte.
- seejärel võib tulla mitu lauset (või isegi mitu lõiku) kirjeldust
- parameetrid kirjeldatakse ära @param sildiga:
@param [muutuja-nimi] [kirjeldus]
- tagastusväärtus (kui see on olemas) kirjeldatakse @return sildiga:
@return [kirjeldus]
- silte on palju erinevaid lisaks nendele kahele mainitule
- lõppeb */ sümbolitega eraldi real
Rohkem informatsiooni: http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html
Näide 3N funktsioonist:
<source lang="java"> static void print3NSequence(int startingValue) {
int N = startingValue; int count = 1; System.out.println("The 3N+1 sequence starting from " + N); System.out.println(); System.out.println(N);
while (N > 1) { if (N % 2 == 1) // is N odd? N = 3 * N + 1; else N = N / 2; count++; // count this term System.out.println (N); // print this term } System.out.println (); System.out.println ( "There were " + count + " terms in the sequence.");
} // -print3NSequence()
</source>
Kui nüüd seda funktsiooni on vaja koodis välja kutsuda, tehakse seda järgnevalt:
print3NSequence(17);
mis kutsub eelkirjeldatud funktsiooni välja algväärtusega 17 (ehk siis funktsioonis startingValue = 17).
Samamoodi võib funktsiooni välja kutsuda muutujaga:
print3NSequence(k);
k peab olema int-tüüpi muutuja. Funktsioon kutsutakse välja k väärtusega. k väärtust ei muudeta.
Veel näide funktsiooni parameetritest ja väljakutsumisest: <source lang="java"> static void doTask(int N, double x, boolean test) { // statements to perform the task go here } </source>
Sellise funktsiooni võib välja kutsuda nii:
<source lang="java"> doTask(17, Math.sqrt(z + 1), z >= 10); </source>
See väljakutse teeb umbes sama välja, kui enne doTask sisu käivitada järgmine koodilõik: <source lang="java"> // declare an int named N with initial value 17 int N = 17;
// compute Math.sqrt(z + 1), use it to initialize // a new variable x of type double double x = Math.sqrt(z + 1);
// evaluate "z >= 10" and use the resulting true/false // value to initialize a new variable boolean test = (z >= 10); </source>