上一節中的單例對象MarkerFactory 就是一個獨立對象的例子。儘管它管理著Marker類,但是它並沒有關聯到任何類上。 scala也可以創建關聯到類上的對象。這樣的對象同類共用同一個名字,這樣的對象稱為伴生對象,對應的類就稱為伴生類。在scala里,類和伴生對象沒有界限,它們互相可以訪問彼此... ...
上一節中的單例對象MarkerFactory 就是一個獨立對象的例子。儘管它管理著Marker類,但是它並沒有關聯到任何類上。
scala也可以創建關聯到類上的對象。這樣的對象同類共用同一個名字,這樣的對象稱為伴生對象,對應的類就稱為伴生類。在scala里,類和伴生對象沒有界限,它們互相可以訪問彼此的private 方法和private 屬性。下麵使用伴生對象重寫了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 getMarker(color: String) = if (markers.contains(color)) markers(color) else null }
在重構後的代碼中為Marker類新建了伴生對象,伴生對象就是Marker類的實例了。此外還使用private修飾了Marker的主構造函數,確保只有它的伴生對象可以創建Marker類的實例,從而保證了Marker類的單例特性。當然了,也可以不把Marker類的主構造函數聲明為private,但是此時Marker對象作為Marker類的單例實現就仍是不嚴密的。
使用如下的代碼調用Marker類:
println(Marker getMarker "blue") println (Marker getMarker "blue") println (Marker getMarker "red") println (Marker getMarker "red")
輸出如下:
每個類都可以有伴生對象。伴生對象和伴生類寫在同一個文件中,伴生對象在scala中很常見,它們提供了在類一級進行操作的便捷方法。從某種方面來說,它們還可以作為scala缺少靜態成員的變通措施。
######