前面兩節學了scala的對象和伴生對象,這兩個在使用的時候很有些java的靜態成員的意思。
scala中沒有靜態字段和靜態方法。靜態成員會破壞scala所支持的完整的面向對象模型。不過可以通過伴生對象實現對scala的類一級的操作。
回過頭來再看一遍那個Marker的例子,略做了一些調整:
class Marker private(val color: String) { println("Creating " + this) override def toString(): String = "marker color " + color } object Marker { private val markers = Map("red" -> new Marker("red"), "blue" -> new Marker("blue"), "green" -> new Marker("green")) def primaryColors = "red, green, blue" def apply(color: String) = if (markers.contains(color)) markers(color) else null } println("Primary colors are : " + Marker.primaryColors) println(Marker("blue")) println(Marker("red"))
在調整后的代碼里,使用def關鍵字為Marker對象聲明了一個primaryColors方法,這個方法返回了一個字符串“red, green, blue”(如果沒有參數的話,方法中的括號是可以省略的,而且return也是可以省略的)。調用這個方法的方式就跟在Java中調用靜態方法一樣。
使用伴生對象還有另外一點好處:可以不使用new關鍵字就能創建伴生類的實例。這里主要依賴了apply方法,它是scala提供的語法糖。上面的代碼在調用Marker(“blue”)的時候,其實就是在調用Marker.apply(“blue”)。通過這樣的方法可以讓實例的創建和獲取更加容易。
來看一下這個方法的執行結果:

