6 Scala对象

  • object ,需要某个类的单例实例或者其他值或函数一个挂靠的地方。
  • 用对象作为单例或存放工具的方法

单例对象

  • Scala用object达到静态方法或静态字段的目的
  • 对象定义了某个类的单个实例
  • 对象的构造器在该对象第一次被使用时调用,如果不被使用,那么构造器也不会被执行
  • 对象本质上可以拥有类的所有特性,可以扩展其他类或特质,但是不能提供构造器参数
  • 对象的使用场景
    – 存放工具函数或常量
    –高效共享单个不可变实例
    –需要用单个实例协调某个服务
object Accounts{
  private var lastNumber = 0
  def newUniqueNumber():Int={
    lastNumber += 1
    lastNumber
  }
}

伴生对象

  • 对象和类同名,互为伴生,伴生对象伴生类
  • 类和它的伴生对象可以互相访问私有特性,必须放在同一个源文件中
  • 类的伴生对象的功能特性不在类的作用域内,Account类内不能直接使用newUniqueNumber()
//伴生类
class Account {
  val id = Account.newUniqueNumber()
  private var balance = 0.0

  def deposit(amount: Double): Unit = {
    balance += amount
  }

  def yue = balance
}
//伴生对象
object Account{
  private var lastNumber = 0
  private def newUniqueNumber():Int={
    lastNumber+=1
    lastNumber
  }
}
//使用
val sam = new Account
println(sam.id)
println(sam.yue)
sam.deposit(1000)
println(sam.yue)

扩展类或特质的对象

  • object可以扩展类以及一个或多个特质,其结果是一个扩展了指定类以及特质的类的对象,同时拥有对象定义中给出的所有特性
abstract class UndoableAction(val description:String){
  def undo():Unit
  def redo():Unit
}
object DoNothingAction extends UndoableAction("Do Nothing"){
  override def undo(): Unit = {}
  override def redo(): Unit = {}
}


val actions = Map("open"->DoNothingAction,"save"->DoNothingAction)

Apply方法

  • Object(参数1,参数2,…,参数n) 会调用对象的apply方法,返回的是伴生类的对象
  • 例如Array定义了apply方法,因此可以不用new Array,直接使用Array()
//类
class Account private(val id:Int,initialBalance:Double){
  private var balance = initialBalance
}
//伴生对象
object Account{
  def apply(initialBalance: Double): Account = {
    new Account(newUniqueNumber,initialBalance)
  }
  private var lastNumber = 0
  private def newUniqueNumber():Int={
    lastNumber+=1
    lastNumber
  }
}
//使用时不用new了,伴生对象里定义了apply方法,里面已经new了
val sam = Account(12)
val bob = Account(400)
println(bob.id)

应用程序对象

  • 每个scala程序必须从一个main方法开始,方法的类型为Array[String] => Unit
  • 如果不用main方法,可以扩展App特质,如果需要命令行参数可以通过args属性获得
object Hello extends App{
  if(args.length>0){
    println(f"Hello ${args(0)}")
  }else{
    println("Hello World")
  }
}

枚举

  • 使用Enumeration助手类产生枚举
  • 枚举的类型是TrafficLightColor.Value
  • 获取id和名称通过id和toString方法
object TrafficLightColor extends Enumeration{
  //val Red,Yellow,Green = Value
  //Value 可以传入ID、名称,或两个同时,如果不传入名称则为变量名
  val Red = Value(0,"Stop")
  val Yellow=Value(10)
  val Green=Value("Go")
}

//使用
scala> TrafficLightColor.Red
res20: TrafficLightColor.Value = Stop

scala> TrafficLightColor.Green
res21: TrafficLightColor.Value = Go

scala> TrafficLightColor.Yellow
res22: TrafficLightColor.Value = 10

// id和名称通过id和toString方法
scala> TrafficLightColor.Yellow.toString
res25: String = Yellow

scala> TrafficLightColor.Yellow.id
res26: Int = 10

// 遍历所有的枚举值
scala> for(i <- TrafficLightColor.values) println(s"${i.id}:$i")
0:Stop
10:Yellow
11:Go

// 通过ID或名称查找定位
scala> TrafficLightColor.withName("Yellow")
res43: TrafficLightColor.Value = Yellow

scala> TrafficLightColor(11)
res44: TrafficLightColor.Value = Go


发布了57 篇原创文章 · 获赞 73 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_40450867/article/details/103443077