簡體   English   中英

Scala構造函數參數

[英]Scala Constructor Parameters

私有var構造函數參數和沒有val / var的構造函數參數之間有什么區別? 它們的范圍/可見度是否相同?

例如:

class Person(private var firstName:String, lastName:String)

是的,有兩個重要的區別。 首先是簡單的:沒有varval關鍵字的構造函數參數不是可變變量 - 它們的值不能在類的主體中更改。

即使我們將自己局限於val關鍵字, private val和無關鍵字參數之間仍然存在差異。 考慮以下:

class Person(private val firstName: String, lastName: String)

如果我們用javap -v Person查看編譯的類,我們會看到它只有一個字段,對於firstName lastName只是一個構造函數參數,這意味着它可以在初始化類之后進行垃圾收集等。

編譯器足夠聰明,可以知道初始化后何時需要lastName的值,並且在這種情況下它將為它創建一個字段。 請考慮以下變體:

class Person(private val firstName: String, lastName: String) {
  def fullName = firstName + " " + lastName
}

編譯器可以告訴它以后可能需要lastName的值,如果我們再次檢查javap ,我們會看到該類有兩個字段(請注意,如果我們將fullName定義為val而不是def ,那么它就是只有一個字段)。

最后,請注意,如果我們使firstName object-private而不是class-private ,它的工作方式與普通的無關鍵字構造函數參數完全相同:

class Person(private[this] val firstName: String, lastName: String)

這甚至可以使用var而不是val

class Person(private[this] var firstName: String, lastName: String)

這兩個類都沒有字段。 有關對象 - 私有訪問的更多詳細信息,請參閱語言規范的第5.2節。

作為補充,如果您的類是一個案例類,所有構造函數參數將自動為公共字段。

編譯器會抱怨private關鍵字(如果存在),對於沒有val / var的參數,無論是否在任何defs中使用它們,都會為它們生成公共字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM