Scala 為訪問控制修飾符添加作用域

2018-09-28 18:17 更新

為訪問控制修飾符添加作用域

Scala 的訪問修飾符可以添加作用域參數(shù)。作用域的語法如下:

private[x]或protected[x]

其中 x 代表某個包,類或者對象,表示可以訪問這個 Private 或的 protected 的范圍直到 X。

通過為訪問修飾符添加作用域參數(shù),可以非常精確的控制所定義的類型能夠被其它類型訪問的范圍。尤其是可以支持 Java 語言支持的 package private,package protected 等效果。

下面的例子為這種用法的一個示例:

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
    }
}

在這個例子中,類 Navigator 使用 private[bobsrockets] 來修飾,這表示這個類可以被 bobsrockets 中所有類型訪問,比如通常情況下 Vehicle 無法訪問私有類型 Navigator,但使用包作用域之后,Vechile 中可以訪問 Navigator。

這種技巧在分散在多個 Package 的大型項目時非常有用,它允許你定義一些在多個子包中可以訪問,但對使用這些 API 的外部客戶代碼隱藏,而這種效果在 Java 中是無法實現(xiàn)的。

此外,Scala 還支持一種比 private 還要嚴格的訪問控制,本例中的 private[this],只允許在定義該成員的類型中訪問,它表示該成員不僅僅只能在定義該成員的類型中訪問,而且只能是由該類型本身訪問。比如:本例中 speed,使用 protected[this],speed,和 this.speed 只在定義該成員的實例中可以訪問,下面的用法也是不合法的,即使它們也在 Navigator 里面。當由于是新創(chuàng)建的另外的實例,編譯出錯:

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號