Oppimateriaalin copyright © 2009 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.
(Muutettu viimeksi 2.4.2009)

Olioita Scalalla

// --- Muodollisesta parametrista yksityinen vakiokenttä: ---
//    (tai oikeastaan ei edes varsinainen kenttä, vakiopa vain...)

class L1 (para:Int) {
  def this() = this(42)  // parametriton konstruktori oletusarvoin
  override def toString =  ""+ para
}

val m1 = new L1(69)
val m2 = new L1()
println(m1)
println(m2)


//  --- Muodollisesta parametrista julkinen kenttä: tietuerakenne: ---

class L2 (var para:Int) {
  def this() = this(42)  // parametriton konstruktori oletusarvoin
  override def toString =  ""+ para
}
val m21 = new L2(69)
val m22 = new L2()
println(m21.para)
println(m22)
m22.para = 666
println(m22)

//  --- Muodollisesta parametrista julkinen vakiokenttä: read-only-tietuerakenne: ---

class L2 (val para:Int) {
  def this() = this(42)  // parametriton konstruktori oletusarvoin
  override def toString =  ""+ para
}
val m21 = new L2(69)
val m22 = new L2()
println(m21.para)
println(m22)
// m22.para = 666 olisi virhe


// --- Muodollisesta parametrista yksityinen kenttä; aksessorit Java-tyyliin: ---

class L3 (private var para:Int) {
  def this() = this(42)  // parametriton konstruktori oletusarvoin
  def setPara(i:Int)  {para = i}   // setteri
  def getPara = para
  override def toString =  ""+ para
}
val m31 = new L3(69)
val m32 = new L3()
println(m31)
println(m32)
m32.setPara(666)
println(m32)
m32.setPara(321)
println(m32.getPara)
Huom: Molemmat muodot
    def setPara(i:Int)   {para = i}
    def setPara(i:Int) = {para = i}
ovat sallittuja. Ensimmäinen tarkoittaa, että funktio on tyypiltään Unit, jälkimmäinen että tyyppi on lausekelistan viimeisen lausekkeen tyyppi - tässä siis Int. Scala idiomin mukaista on kirjoittaa sivuvaikutukselliset arvoa palauttamattomat "setterit" ilman yhtäsuuruusmerkkiä, muut merkin kanssa. Jos lausekelista on yksi lauseke ja "="- merkkiä käytetään, aaltosulkeitakaan ei ole pakko kirjoittaa: def setPara(i:Int) = para = i. Tosin tämä ei ole kaunista tässä; toisin kuin "aidoissa funktioissa": def getPara = para



// --- Erikseen julkinen ja yksityinen muutettava kenttä

class L4 (para:Int) {
  var julkiKent = para  
  private var yksitKent = para
  def this() = this(42)  // parametriton konstruktori oletusarvoin
  def setPara(i:Int)  {yksitKent = i}   // setteri
  override def toString =  julkiKent + " " + yksitKent

}
val m41 = new L4(69)
val m42 = new L4();
println(m41)
println(m42)
m42.julkiKent = 666
println(m42)
m42.setPara(666)
println(m42)

// --- Jne, jne, jne, jne, ...



Takaisin sisältösivulle.