Scala一分鐘小課堂 - Value Classes

Value Classes 主要用於擴展已有類的方法和建立類型安全的數據類型,功能上相似隱式轉換,可是在運行時比隱式轉換更節省內存。全部的 Value Classes 都繼承自 AnyVal ,例如:html

class Wrapper(val underlying: Int) extends AnyVal

擴展已有類的方法java

結合 implicit classes ,咱們能夠利用 Value Class 擴展已有類的方法, Scala 基礎類庫中的 RichInt 就是一個很好的例子,正是由於 RichInt 定義了 toHexString 方法,安全

implicit class RichInt(val self: Int) extends AnyVal {
  def toHexString: String = java.lang.Integer.toHexString(self)
}

因此咱們才能直接在 Int 類型上使用這個方法:app

3.toHexString

在運行時,上面的代碼會轉換成靜態方法調用,不會建立任何新對象,scala

RichInt$.MODULE$.extension$toHexString(3)

類型安全的數據類型htm

Value Class 的另外一個用法是建立類型安全的數據類型,而且沒有額外的運行時內存開銷。例如咱們能夠建立一個表示距離的 Value Class,對象

class Meter(val value: Double) extends AnyVal {
  def +(m: Meter): Meter = new Meter(value + m.value)
}

而後咱們能夠對兩個距離相加,繼承

val x = new Meter(3.4)
val y = new Meter(4.3)
val z = x + y

在運行時,上面的代碼不會建立任何的 Meter 對象,而只是基於 double 類型作基本的數學運算。這樣既保證了 Meter 類型在作加法運算時的類型安全,同時也下降了運行時的內存開銷。ip

參考:https://docs.scala-lang.org/overviews/core/value-classes.html內存

相關文章
相關標籤/搜索