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.