我學習Scala
和Programming in Scala 3rd Ed
,Ch 10, Page 225
,部分Overriding methods and fields
,它說斯卡拉與VAL覆蓋高清,拋出NPE
的統一訪問原則僅僅是一個方面的基礎斯卡拉對待 字段和方法更均勻地比Java 。另一個區別是在Scala中, ,字段和方法屬於同一個命名空間。這個 使字段可以覆蓋無參數的方法。對於 例如,你可以 ArrayElement從一個字段的方法改變內容的執行類,而無需修改的類元素含量 抽象方法定義,如 清單10.4:
我基於示例代碼
與高清
abstract class Element {
def contents: Array[String]
val height = contents.length
val width = if (height == 0) 0 else contents(0).length
}
class ArrayElement(contnts: Array[String]) extends Element {
def contents: Array[String] = contnts
}
// --
val ae = new ArrayElement(Array("hello", "world"))
ae.height
ae.width
我得到
ae: ArrayElement = [email protected]
res0: Int = 2
res1: Int = 5
與高清重寫爲VAL在ArrayElement
abstract class Element {
def contents: Array[String]
val height = contents.length
val width = if (height == 0) 0 else contents(0).length
}
class ArrayElement(contnts: Array[String]) extends Element {
val contents: Array[String] = contnts
}
// --
val ae = new ArrayElement(Array("hello", "world"))
ae.height
ae.width
我得到NPE
作爲
java.lang.NullPointerException
at #worksheet#.Element.<init>(scratch.scala:4)
at #worksheet#.ArrayElement.<init>(scratch.scala:10)
at #worksheet#.ae$lzycompute(scratch.scala:15)
at #worksheet#.ae(scratch.scala:15)
at #worksheet#.#worksheet#(scratch.scala:14)
我缺少什麼?
真。一個簡單的經驗法則是從不在'val'內引用一個抽象的'def',因爲沒有保證'val'在val被實例化的時候會有任何值。 @Daenyth,我編輯了你的評論以提供另一種選擇 – Sergey