第8章 对象
8.1 单例对象
Scala 中没有静态方法和静态字段, 你可以用 object 这个语法结构来达到同样的目的。
class Man private(val sex: String, name: String){
def describe = {
println("Sex:" + sex + "name:" + name)
}
}
object Man{
var instance: Man = null
def apply(name: String)={
if(instance == null){
instance = new Man("男", name)
}
instance
}
}
对象构造器在该对象第一次使用时调用。如果对象没有使用过,他的构造器不会被执行。
对象基本具有类的所有特性,就是一点,你不能设置构造器的参数。
测试:
val man1 = Man("Nick") val man2 = Man("Thomas") man1.describe man2.describe
8.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 { // The companion object
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
尖叫提示:
类和它的伴生对象可以相互访问私有特性,他们必须存在同一个源文件
中。必须同名
8.3 Apply 方法
1)apply 方法一般都声明在伴生类对象中,可以用来实例化伴生类对象:
class Man private(val sex: String, name: String){
def describe = {
println("Sex:" + sex + "name:" + name)
}
}
object Man{
def apply(name: String)={
new Man("男", name)
}
}
测试:
val man1 = Man("Nick")
val man2 = Man("Thomas")
man1.describe
man2.describe
2)也可以用来实现单例模式,我们只需要对上述例子稍加改动:
看上面 8.1 单例模式
8.4 应用程序对象
每一个 Scala 应用程序都需要从一个对象的 main 方法开始执行,这个方
法的类型为 Array[String]=>Unit。
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
或者扩展一个App特征:
object ObjectSyllabus extends App{
if(args.length > 0)
println("hello," + args(0))
else
println("hello,world!")
}
8.5 枚举
Scala 中没有枚举类型,定义一个扩展 Enumeration 类的对象,并以 value
调用初始化枚举中的所有可能值。
object TrafficLightColor extends Enumeration {
val Red = Value(0, "Stop")
val Yellow = Value(10) // Name "Yellow"
val Green = Value("Go") // ID 11
}
测试:
println(TrafficLightColor.Red)
println(TrafficLightColor.Red.id)
println(TrafficLightColor.Red.toString)