Chapter06 对象

1. 单例对象

  • scala中没有静态方法或静态变量,可以使用object达到同样的目的。
    object Accounts {
      private var lastNumber = 0
      def newUniqueNumber() = { lastNumber += 1; lastNumber }
    }
  • 对象的构造器在该对象第一次被使用时调用。

  • scala对象可以用来实现:

  1. 存放工具函数或常量
  2. 共享单个不可变实例
  3. 需要用单个实例协调某个服务

2. 伴生对象

  • JAVA中会既有实例方法又有静态方法的类,Scala中用类和与类同名的“伴生”对象实现。
    class Account {
      val id = Account.newUniqueNumber()
      private var balance = 0.0
      def deposit(amount: Double) { balance += amount }
      def description = "Account " + id + " with balance " + balance
    }

    object Account { // 伴生对象
      private var lastNumber = 0
      private def newUniqueNumber() = { lastNumber += 1; lastNumber }
    }


    val acct1 = new Account
    val acct2 = new Account
    acct1.deposit(1000)
    val d1 = acct1.description
    val d2 = acct2.description
  • 类和它的伴生对象可以相互访问私有特征。

总结:个人理解,scala中引入object就是为了解决没有静态变量或静态方法的问题。


3. 扩展类或特质的对象

  • 一个object可以扩展类以及一个或多个特质。
    abstract class UndoableAction(val description: String) {
      def undo(): Unit
      def redo(): Unit
    }

    object DoNothingAction extends UndoableAction("Do nothing") {
      override def undo() {}
      override def redo() {}
    }

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

4. apply方法

  • 不使用new,而直接使用object(参数1,…,参数N),这时候apply方法会被调用。
    class Account private (val id: Int, initialBalance: Double) {
      private var balance = initialBalance
      def deposit(amount: Double) { balance += amount }
      def description = "Account " + id + " with balance " + balance
    }

    object Account { // The companion object
      def apply(initialBalance: Double) = 
        new Account(newUniqueNumber(), initialBalance)
      private var lastNumber = 0
      private def newUniqueNumber() = { lastNumber += 1; lastNumber }
    }

    val acct = Account(1000.0)
    val d = acct.description

5. 应用程序对象

  • scala程序都是从对象main方法开始
    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
  • 保存为Hello.scala文件,执行:scalac Hello.scala编译文件,执行:scala Hello运行程序。

6. 枚举

  • scala 中没有枚举类型,但有枚举类,Enumeration
    object TrafficLightColor extends Enumeration {
      val Red, Yellow, Green = Value
    }

    TrafficLightColor.Red
    TrafficLightColor.Red.id

    object TrafficLightColor extends Enumeration {
      val Red = Value(0, "Stop")
      val Yellow = Value(10) // Name "Yellow"
      val Green = Value("Go") // ID 11
    }
  • Value中可以不传值,可以传入ID、名称。

  • 枚举的ID可以通过id方法返回,名称通过toString方法返回。


【待续】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值