目录
摘要
静态方法,单例对象使用及作用,伴生对象,扩展类的对象,应用程序对象,枚举
对象与枚举
对象
单例对象
- 与类不同,单例对象使用
object
进行声明 - Scala 没有静态属性和方法,需要使用单例对象来实现类似的功能。
- 对象的构造器不能提供构造器参数,在第一次使用时会被初始化。
object Singleton {
private var num = 0
def sequence() = {
num += 1
num
}
}
Singleton.sequence()
单例对象可以用于提供常量及共享不可变对象。
伴生对象
- 单例对象和类可以拥有相同名字,此时也称此单例对象为伴生对象。
- 伴生对象可以用于让一个类即拥有实例化方法又有静态方法。
- 伴生对象必须与同名类位于同一源文件中。
- 伴生对象与类可以互相访问各自的私有成员。
class Companion(private var balance: Int = 0) {
val id = Companion.sequence() //访问伴生对象的私有方法
}
object Companion {
private var num = 0
private def sequence(): Int = {
num += 1
num
}
def getInfo(comp: Companion): String = {
"balance is " + comp.balance //访问类的私有属性
}
}
扩展类的对象
可用于实现类的可共享的默认对象
基类
abstract class UndoableAction(val description: String) {
def undo
def redo
}
扩展对象
object DoNothing extends UndoableAction("Do nothing") {
override def undo: Unit = ???
override def redo: Unit = ???
}
//使用默认对象
val actions = Map("open" -> DoNothing, "save" -> DoNothing)
应用程序对象
应用程序对象即对象拥有 main()
方法或继承 App
类。该对象是一个应用的入口,可以通过 args
获得命令行参数。
object Hello extends App {
println("Hello World")
if (args.length > 0) {
println("args:" + args(0))
} else {
println("no args")
}
}
枚举
- Scala 并没有枚举类型,而是通过对象继承
Enumeration
类实现枚举功能。 - 每次调用
Value
方法时都会自动生成一个枚举实例。Value
构造器为()
,(id, name)
或(name)
。
构造枚举
object TrafficColor extends Enumeration {
val RED = Value(0, "stop")
val YELLOW = Value(10)
val GREEN = Value("go")
val BLUE = Value
}
使用枚举
//直接获得枚举
var red = TrafficColor.RED
//通过索引获得枚举
red = TrafficColor(0)
//通过 name 获得枚举
red = TrafficColor.withName("stop")
red.toString //返回 name
red.id //返回 id