Scala 的訪問(wèn)修飾符可以添加作用域參數(shù)。作用域的語(yǔ)法如下:
private[x]或protected[x]
其中 x 代表某個(gè)包,類(lèi)或者對(duì)象,表示可以訪問(wèn)這個(gè) Private 或的 protected 的范圍直到 X。
通過(guò)為訪問(wèn)修飾符添加作用域參數(shù),可以非常精確的控制所定義的類(lèi)型能夠被其它類(lèi)型訪問(wèn)的范圍。尤其是可以支持 Java 語(yǔ)言支持的 package private,package protected 等效果。
下面的例子為這種用法的一個(gè)示例:
package bobsrockets
package navigation{
private[bobsrockets] class Navigator{
protected[navigation] def useStarChart(){}
class LegOfJourney{
private[Navigator] val distance=100
}
private[this] var speed = 200
}
}
package launch{
import navigation._
object Vehicle{
private[launch] val guide=new Navigator
}
}
在這個(gè)例子中,類(lèi) Navigator 使用 private[bobsrockets] 來(lái)修飾,這表示這個(gè)類(lèi)可以被 bobsrockets 中所有類(lèi)型訪問(wèn),比如通常情況下 Vehicle 無(wú)法訪問(wèn)私有類(lèi)型 Navigator,但使用包作用域之后,Vechile 中可以訪問(wèn) Navigator。
這種技巧在分散在多個(gè) Package 的大型項(xiàng)目時(shí)非常有用,它允許你定義一些在多個(gè)子包中可以訪問(wèn),但對(duì)使用這些 API 的外部客戶(hù)代碼隱藏,而這種效果在 Java 中是無(wú)法實(shí)現(xiàn)的。
此外,Scala 還支持一種比 private 還要嚴(yán)格的訪問(wèn)控制,本例中的 private[this],只允許在定義該成員的類(lèi)型中訪問(wèn),它表示該成員不僅僅只能在定義該成員的類(lèi)型中訪問(wèn),而且只能是由該類(lèi)型本身訪問(wèn)。比如:本例中 speed,使用 protected[this],speed,和 this.speed 只在定義該成員的實(shí)例中可以訪問(wèn),下面的用法也是不合法的,即使它們也在 Navigator 里面。當(dāng)由于是新創(chuàng)建的另外的實(shí)例,編譯出錯(cuò):
http://wiki.jikexueyuan.com/project/scala-development-guide/images/19.png" alt="" />