Scala快速入門-5-類定義

知識點

  • 每個類都有一個主構造器,這個構造器和類的定義「交織」在一起,它的參數直接成為類的欄位,主構造器執行類體中所有的語句
  • 類中的欄位自動帶getter和setter方法
  • 用@BeanProperty註解生成JavaBean的getXxx/setXxx方法
  • 輔助構造器是可選的,它們都叫做this

類定義

  • 定義及使用

scala> class Counter { | private var value = 0 | def increment() {value += 1} | def current() = value | }defined class Counterscala> val myCounter = new CountermyCounter: Counter = Counter@396a0391scala> myCounter.increment()scala> println(myCounter.current)1scala> myCounter.increment()scala> println(myCounter.current)2

說明:

Scala源文件中可以包含多個類

調用無參數方法或創建無參數對象時,可以寫圓括弧,也可不寫

約定,對於改值器方法(即改變對象狀態的方法)用(),而對於取值器方法(不改變對象狀態的方法)去掉()

  • Scala對每個欄位都提供getter和setter方法,如下定義一個公有欄位

scala> class Person { | var age = 0 | }defined class Person

Scala生成面向JVM的類時,其中有一個私有的age欄位及相應的兩個公有的getter和setter方法;

對於私有欄位,getter和setter方法也是私有的;

在Scala中,getter和setter分別叫做age和age_= (注意下劃線和等號間沒有空格)

  • 重新定義getter和setter方法,如:年齡不能設置成比現在的更小

scala> class Person{ | private var privateAge = 0 | def age = privateAge | def age_= (newValue: Int) { | if (newValue > privateAge) privateAge = newValue | } | }defined class Person// 測試scala> val fred = new Personfred: Person = Person@718f1128scala> fred.age = 30fred.age: Int = 30scala> fred.ageres0: Int = 30scala> fred.age = 21fred.age: Int = 30scala> fred.ageres1: Int = 30

  • 如何控制Scala對每個欄位生成getter和setter的方法?

如果欄位是私有的,則getter和setter方法也是私有的

如果欄位是val, 則只生成getter方法

如果不需要任何getter和setter,將欄位聲明為private[this]即可

  • 用@BeanProperty註解生成JavaBean的getXxx/setXxx方法

scala> import scala.reflect.BeanPropertyimport scala.reflect.BeanPropertyscala> class Person{ | @BeanProperty var name: String = _ | }defined class Person

將會生成四個方法:

  1. name: String
  2. name_=(new Value: String): Unit
  3. getName(): String
  4. setName(newValue: String): Unit
  • 如果以主構造器參數的方式定義欄位,並且需要JavaBeans版本的getter和setter方法,可以在構造器參數上加註解即可

class Person (@BeanProperty val name: String)

構造器

主構造器

  • 在Scala中,每個類都有主構造器。與類定義交織在一起。
  • 如果類名之後沒有參數,則該類具備一個無參數主構造器。
  • 如果有參數,則把參數直接放置在類名之後。主構造器的參數被編譯成欄位,其值被初始化成構造時傳入的參數。
  • 主構造器會執行類定義中的所有語句。

class Person(val name: String, val age: Int) { // 在定義對象時,println語句是主構造器的一部分,會被執行 println("Just constructed person") def desc = name + " is " + age + " years old."}

  • 可以通過在主構造器中使用默認參數來避免過多地使用輔助構造器。
  • 如果想讓主構造器成為私有的,可以在參數列表前放置private關鍵字。

// Scalaclass Person(val name: String, val age: Int) {}// 以上代碼相當於Java的以下代碼public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // getter and setter ...}

輔助構造器

  • 除了主構造器外,可以定義任意多的輔助構造器
  • 輔助構造器的名稱為this。
  • 每一個輔助構造器都必須以一個對先前已經定義的其他輔助構造器或主構造器的調用開始。

class Person { private var name = "" private var age = 0 def this(name: String) { // 調用主構造器 this() this.name = name } def this(name: String, age: Int) { // 調用前一個輔助構造器 this(name) this.age = age }}// 可以以三種方式構造對象:// 主構造器val p1 = new Person// 第一個輔助構造器val p2 = new Person("Fred")// 第二個輔助構造器val p3 = new Person("Fred", 42)

敬請期待下一篇~

作者:Yezhiwei

鏈接:Yezhiwei的博客 | Yezhiwei Blog

聲明:本文來源於網路,版權歸作者所有,轉載請註明,若有什麼問題,請聯繫我們,謝謝!

推薦閱讀:

#Scala#一個函數的分析,以及生活路上
scala 庫是如何做到並行的?
為什麼 Scala 不建議用 return?
國內有哪些 Scala 大牛?
如何评价Functional Programming in Scala 这本书?

TAG:Scala | 入门指南 |