[英]Scala Constructor Parameters
私有var構造函數參數和沒有val / var的構造函數參數之間有什么區別? 它們的范圍/可見度是否相同?
例如:
class Person(private var firstName:String, lastName:String)
是的,有兩個重要的區別。 首先是簡單的:沒有var
或val
關鍵字的構造函數參數不是可變變量 - 它們的值不能在類的主體中更改。
即使我們將自己局限於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.