Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

8.5.4 Nimessään arvon palauttavat funktiot

Funktion arvo palautetaan return - lauseessa. Jokaisessa ei- void - tyyppiseksi esitellyssä funktiossa tulee olla vähintään yksi return - lause. void- tyyppisessäkin voi olla return- lause. Tarvittaessa return- lauseita voi olla useampiakin:

	public static int suurempi(int a, int b)
	{
	  if ( a >= b ) return a;
	  return b;
	}

Kun return - lause tulee vastaan, lopetetaan HETI funktion suoritus. Tällöin myöhemmin olevilla lauseilla ei ole mitään merkitystä. Näin ollen useat return- lauseet ovat mielekkäitä vain ehdollisissa rakenteissa. Siis seuraavassa ei olisi mitään mieltä:

	public static int hopo(int a) 	:-(
	{
	  int i;
	  return 5;  /* Palauttaa aina 5!!! */
	  i = 3 + a;
	  return i+2;
	}

return- lausetta ei saa sotkea siihen, että parametrina vietyjä olioita voidaan pyytää muuttamaan sisältöään funktion aikana:

java-muut\FunJaOlio.java - sivuvaikutuksellinen funktio

	/**
	 * Esimerkki funktiosta joka muuttaa myös parametriään
	 * @author Vesa Lappalainen
	 * @version 1.0 / 05.01.2003
	 */
	public class FunJaOlio {
	
	  private static int pituus_ja_muuta(StringBuffer s)
	  {
	    int pit = s.length();
	    s.delete(0,pit).append("toka"); // pääohjelman jono muuttuu nyt
	    return pit;
	  }
	
	  public static void main(String[] args) {
	    int i; StringBuffer jono = new StringBuffer("eka");
	    i = pituus_ja_muuta(jono);
	    System.out.println("i=" + i + ", jono="+jono); // tulostaa: i=3, jono=toka
	  }
	
	} 

Edellä ei kutsusta näe millään tavalla että kutsun jälkeen jono on muuttunut. Yhtenä Java-kielen miinuksena voidaankin pitää sitä, että siitä puuttuu C++-kielessä oleva mekanismi suojata oliot muutoksilta aliohjelman suorituksen aikana ( const).

Näin paljon jääkin ohjelmoijan vastuulle, eli ohjelmoijan pitää nimetä aliohjelmat siten, että niiden nimi jo paljastaa jos jotakin parametria muutetaan ohjelman suorituksen aikana. Ja sitten aliohjelmat on tehtävä huolellisesti, etteivät ne todellakaan muuta kutsuparametrejaan jollei se ole aliohjelmien tarkoitus.

Tehtävä 8.8 Funktio ja osoitin

Mitä pääohjelma FunJaOlio tulostaisi jos aliohjelma olisikin ollut:
	  private static int pituus_ja_muuta(StringBuffer s)
	  {
	    s.append("toka");
	    return s.length();
	  }

Tehtävä 8.9 String vs. StringBuffer

Kirjoita edellisestä tehtävästä versio jossa muutat kaikki StringBuffer => String ja korvaat append-metodin concat-metodilla. Mitä tulostuu?

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys