伴生对象的应用场景

伴生对象

object Accounts {
  private var lastNumber = 0
  def newUniqueNumber() = {lastNumber += 1; lastNumber}

}

class Accounts {
  val id = Accounts.newUniqueNumber()
  private var balance = 0.0
  def deposit(ammount: Double)  {balance += ammount}
}
val a1 = Accounts
println(a1.newUniqueNumber())
val a2 = Accounts
println(a2.newUniqueNumber())
val a3 = Accounts
println(a3.newUniqueNumber())
println(a1.newUniqueNumber())

val a4 = new Accounts
println(a4.id)
println(a4.id)
println(a1.newUniqueNumber())

defined module Accounts





defined class Accounts




a1: Accounts.type = quick_learn.A$A41$A$A41$Accounts$@5898b471
1
res0: Unit = ()
a2: Accounts.type = quick_learn.A$A41$A$A41$Accounts$@5898b471
2
res1: Unit = ()
a3: Accounts.type = quick_learn.A$A41$A$A41$Accounts$@5898b471
3
res2: Unit = ()
4
res3: Unit = ()

a4: Accounts = quick_learn.A$A41$A$A41$Accounts@600884eb
5
res4: Unit = ()
5
res5: Unit = ()
6
res6: Unit = ()

ch14 模式匹配和样例类

Scala有一个十分强大的模式匹配机制,可以应用在很多场合中: Switch语句、类型查询、以及"析构"(获取复杂表达式中的不同部分)。除此之外,Scala还提供了样例类, 对模式匹配进行了优化。

  • match表达式是一个更好的switch,不会有意外调入到下一个分支的问题。
  • 如果没有模式能够匹配,会跑出MatchError。可以用case _ 模式来避免。
  • 模式可以包含一个随意定义的条件,称为守卫
  • 你可以对表达式的类型进行匹配; 优先选择模式匹配而不是isInstanceOf/ asInstanceOf
  • 你可以匹配数组、元组和样例类的模式,然后将匹配到的不同部分绑定到变量
  • 在for表达式中,不能匹配的情况会被安静的跳过
  • 样例类是编译器会为之自动产出模式匹配所需要的方法的类
  • 样例类集成层级中的公共超累应该是sealed的
  • 用Option来存放对于可能存在也可能不存在的值--- 这笔null更安全