Scala开发教程(57): 为访问控制修饰符添加作用域

jerry Scala 2015年11月25日 收藏

Scala的访问修饰符可以添加作用域参数。作用域的语法如下:
private[x]或protected[x]
其中x代表某个包,类或者对象,表示可以访问这个Private或的protected的范围直到X。

通过为访问修饰符添加作用域参数,可以非常精确的控制所定义的类型能够被其它类型访问的范围。尤其是可以支持Java语言支持的package private, package protected等效果。

下面的例子为这种用法的一个示例:

  1. package bobsrockets
  2.  
  3. package navigation{
  4. private[bobsrockets] class Navigator{
  5. protected[navigation] def useStarChart(){}
  6. class LegOfJourney{
  7. private[Navigator] val distance=100
  8. }
  9.  
  10. private[this] var speed = 200
  11.  
  12.  
  13.  
  14. }
  15. }
  16.  
  17. package launch{
  18. import navigation._
  19. object Vehicle{
  20. private[launch] val guide=new Navigator
  21. }
  22. }

在这个例子中,类Navigator使用private[bobsrockets]来修饰,这表示这个类可以被bobsrockets中所有类型访问,比如通常情况下Vehicle无法访问私有类型Navigator,但使用包作用域之后,Vechile中可以访问Navigator.

这种技巧在分散在多个Package的大型项目时非常有用,它允许你定义一些在多个子包中可以访问,但对使用这些API的外部客户代码隐藏,而这种效果在Java中是无法实现的。

此外,Scala还支持一种比private还要严格的访问控制,中的private[this],只允许在定义该成员的类型中访问,它表示该成员不仅仅只能在定义该成员的类型中访问,而且只能是由该类型本身访问。比如:
中speed,使用 protected[this], speed,和this.speed只在定义该成员的实例中可以访问,下面的用法也是不合法的,即使它们也在Navigator里面。当由于是新创建的另外的实例,编译出错:

20140324001