混淆scala私有字段变量

时间:2015-08-12 05:09:52

标签: scala

我正在进行斯卡拉研究的第三天。使用书"开始scala"。

作者使用一个例子来显示变量define与val var之间的差异而没有var val:

class Book(private val title: String) {
   def printTitle(b: Book) {
       println(b.title)
   }
}

在控制台中:

scala> val book = new Book("Beginning Scala")
book: Book = Book@ea05be
scala> book.printTitle(new Book("Beginning Erlang"))
Beginning Erlang

这让我困惑的不是有/无val var,而是私有修饰符:

我不确定我是否理解私权,但如果scala想要标题作为私人字段,那么为什么它允许其他人从外部访问,我认为prinTitle不应该能够访问新书(" Beginning Erlang")的标题字段

2 个答案:

答案 0 :(得分:8)

title私有到类,而不是实例,因为方法printTitle是类的成员,它可以访问其他的私有值实例

如果您希望title成为该实例的私有,则可以使用private[this]修饰符。

此外,private[package]修饰符,其中package是定义所在的包的名称,可以与包共享私有成员。例如

package com.sample.foo

class Book(private[foo] title: String)
com.sample.foo

中的所有代码都可以访问

答案 1 :(得分:3)

title是类Book的私有字段。

在Java中,您可以这样写:

class Book {
    private final String title;

    Book(String title) {
        this.title = title;
    }

    public void printTitle(b: Book) {
       System.out.println(b.title)
    }
 }

我认为函数printTitle可能有点令人困惑,因为在java和scala中它通常不会被实现为实例方法。 我会写这样的东西作为java中的静态方法。在scala中,我会将它放入伴侣对象(在混乱的scala newby中抛出另一个外星人概念;)):

class Book(private val title: String)

object Book {
    def printTitle(b: Book) {
       println(b.title)
   }
}

因此,Book可以访问任何Book实例的私有字段。

如果您想限制对Book实例的标题访问,您可以编写如下内容:

class Book(private[this] val title: String) {
   // no longer compiles
   // def printTitle(b: Book) {
   //    println(b.title)
   //}

   def printTitle() {
       println(title)
   }
}