单例对象
Scala没有静态方法或静态字段,你可以用object这个语法结构来达到同样目的,
object HelloWorld { private var lastNumber = 0 def newUniqueNumber()={lastNumber+=1;lastNumber} }
使用的时候直接调用HelloWorld.newUniqueNumber()即可。对象的构造器在该对象第一次被使用时调用,如果一个对象从未被使用,那么其构造器也不会被执行。在Scala中用对象可以来实现:
- 作为存放工具函数或常量的地方
- 高效地共享单个不可变实例
- 需要用单个实例来协调某个服务时
类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中。调用方式:Account.newUniqueNumber()来调用伴生对象的方法
class Account{ } object Account{//伴生对象 private var lastNumber = 0 private def newUniqueNumber()={lastNumber+=1;lastNumber} } |
apply方法
当Object(参数1,...,参数N),通常这样一个apply方法返回的是伴生类的对象。Array(100)和new Array(100)很容易搞混。前一个调用的是apply(100),输出一个单元素的Array[Int],而第二个调用的是构造器this(100),结果是Array[Nothing],它包含了100个null元素。
应用程序对象
每个Scala程序都必须从一个对象的main方法开始,方法类型为Array[String]=>Unit:
object Hello{ def main(args : Array[String]){ println() } } |
除了每次都提供自己的main方法外,你也可以扩展App特质,然后将程序代码放进构造器方法体内:
object Hello extends App{ def main(args : Array[String]){ println() } } |
Enumeration
object MyEnum extends Enumeration { //定义三个字段,然后用Value调用将它们初始化,每次调用Value都返回内部类的新实例,该内部类也叫做Value,或者你也可以向Value方法传入ID/名称/两个参数都传 val Red, Yellow, Green = Value } object Hi { def main(args: Array[String]) { //可以通过如下语句直接引入枚举值 //import MyEnum._ //记住枚举的类型是MyEnum.Value而不是MyEnum //type MyEnum = Value //此句话用来设置类型别名,这样的话,枚举的类型就变成了MyEnum.MyEnum //枚举值的ID可通过id方法返回,名称通过toString方法返回,对MyEnum.values的调用输出所有枚举值的集合 //可以通过枚举的ID或名称来进行查找定位,以下两句输出内容一样 println(MyEnum(0)) println(MyEnum.withName("Red")) } }
Scala对象
时间: 2024-10-15 04:29:47