首页 > 数据库 > 数据库开发技术 > Scala快速入门-6-单例对象及伴生对象

用对象作为单例或存放工具方法,Scala没有静态方法或字段
类可以有一个同名的伴生对象
对象的apply方法通常用来构造伴生类的新实例
Scala的main函数定义
Scala没有静态方法或字段,可以用object语法定义结构,对象定义了类的单个实例。
对象的构造器在该对象第一次使用时被调用。
不能提供构造器参数。
作为存放工具函数或常量的地方。
高效地共享单个不可变实例。
scala> object Accounts {
| private var lastNumber = 0
|
| def newUniqueNumber() = {
| lastNumber += 1
| lastNumber
| }
|
| }
defined module Accounts
scala>
scala> Accounts.newUniqueNumber()
res2: Int = 1
scala> Accounts.newUniqueNumber()
res3: Int = 2
在Scala中,可通过类和类同名的“伴生”对象来达到静态方法的目的。
类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中
一般在伴生对象中定义apply方法
常用于初始化操作或创建单例对象
在生成这个类的对象时,就省去了new关键字
在遇到Object(参数1,参数2,......,参数n)时就会自动调用apply()方法
Scala程序必须从一个对象的main方法开始
有两种方法定义
// 执行println语句
object Main {
def main(args: Array[String]): Unit = {
println("=" * 10)
}
}
// 扩展App特质
object Main extends App {
println("=" * 10)
}
class Account {
val id = Account.newUniqueNumber()
private var balance = 0.0
def deposit(amount: Double): Double = {
balance += amount
balance
}
def nowBalance = balance;
}
object Account {
private var lastNumber = 0
private def newUniqueNumber() = {
lastNumber += 1
lastNumber
}
}
object Main {
def main(args: Array[String]): Unit = {
val account = new Account
println(account.id)
println(account.deposit(1))
println("=" * 10)
val account1 = new Account
println(account1.id)
println(account1.deposit(10))
println("=" * 10)
println("a " + account.nowBalance + "; b " + account1.nowBalance)
}
}
// ======= 执行结果
1
1.0
==========
2
10.0
==========
a 1.0; b 10.0
// =================使用apply示例===================
package com.gemantic.bigdata
/**
* @author Yezhiwei
* @date 18/1/4
*/
class Student private (val sno: Int, val name: String){
override def toString: String = {
"sno " + sno + " name " + name
}
}
object Student {
private var sno = 0
private def newSno = {
sno += 1
sno
}
def apply(name: String): Student = {
println("call apply method...")
new Student(newSno, name)
}
}
object StudentMain extends App {
// no new
val student1 = Student("Yezhiwei")
println(student1.toString)
println("*" * 10)
val student2 = Student("Yezhiwei")
println(student2.toString)
}
// 运行结果
call apply method...
sno 1 name Yezhiwei
**********
call apply method...
sno 2 name Yezhiwei
敬请期待下一篇~

原文作者:HelloTech技术派;如有侵权,请联系管理员删除。