QuicklyStudyScala_6
来源:互联网 发布:嗟乎时运不齐命途多舛 编辑:程序博客网 时间:2024/06/06 02:17
class QuicklyStudyScala_6 { def main(args: Array[String]) { //使用scala语法结构, object的语法结构 //在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,就会用到它 // 单例对象 //scala没有静态方法或静态字段, 可以用object这个方法结构来达到同样目的, object Accounts { private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber } } //应用程序中需要一个新的唯一账号时,调用 Account.newUniqueNumber()即可 //对象的构造器在该对象第一次被 使用时调用 //对象本质上可以拥有类的所有特性,它甚至可以扩展其他类或特质,只有一个例外, 你不能提供构造器参数 //在scala中都可以用对象来实现: //作为存放工具函数或常量的地方 //高效地共享单个不可变的实例 //需要用单个实例来协调某个服务时 //伴生对象 //如同java中使用即有实例方法又有静态方法的类,在scala中,可以通过类和与类同名的“伴生”对象来达到同样的目的 class Account { val id = Account.newUniqueNumber() private var balance = 0.0 def deposit(amount: Double) { balance += amount } } object Account { //伴生对象 private var lastNumber = 0 private def newUniqueNumber() = { lastNumber += 1; lastNumber } } //类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中 //类的伴生对象可以被访问,但并不在作用域当中, 如 Account 类必须通过 Account.newUniqueNumber()而不是直接用newUniqueNumber()来调用伴生对象的方法 //扩展类或特质的对象 //一个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); //apply 方法 //定义和使用的apply方法, Object(参数1,参数2) //Array对象定义了apply方法 Array("Mary", "had", "a", "little", "lamb") //对于嵌套表达式 Array(Array(1, 7), Array(2, 9)) // Array(100) 调用apply(100)方法,输出一个单元素(整数100) 的Array[Int] // new Array(100) 调用构造器 this(100), 结果是Array[Nothing], 包含了100个null元素 //定义apply方法的示例 class AccountTest private (val id: Int, initialBalance: Double) { private var balance = initialBalance } object AccountTest { //伴生对象 private var lastNumber = 0 private def newUniqueNumber() = { lastNumber += 1; lastNumber } def apply(initialBalance: Double) = new AccountTest(newUniqueNumber(), initialBalance) } //构建帐户 val acct = AccountTest(1000.0) //应用程序对象 //每个scala程序都必须从一个对象 main 方法开始, 这个方法的类型为 Array[String] => Unit object Hello { def main(args: Array[String]) { println("Hello, World!"); } } //也可以扩展App特质, object HelloApp extends App { println("Hello, World!"); } //命令行参数,通过 args 属性得到 object HelloApp1 extends App { if (args.length > 0) { println("Hello, " + args(0)) } else { println("Hello, World!") } } //枚举 //scala没有枚举类型, 标准库提供了一个Enumeration助手类,可以用于产生枚举 //定义一个扩展Enumeration类的对象,并以value方法调用初始化枚举中的所有可选值 object TrafficLightColor extends Enumeration { // val Red = Value // val Yellow = Value // val Green = Value val Red, Yellow, Green = Value //调用Value方法都返回内部类的新实例, 该内部类也叫做 Value //或向 Value方法传入ID, 名称, 或两个参数都传 // val Red = Value(0, "Stop") // var Yellow = Value(10) // 名称为"Yellow" // val Green = Value("Go") //ID 为 11 //如果不指定, 则ID在将一个枚举值基础上加一,从零开始, 缺省名称为字段名 //定义完成之后, 使用 TrafficLightColor.Red TrafficLightColor.Yellow } //import TrafficLightColor._ //引入枚举值 //枚举的类型是 TrafficLightColor.Value而不是TrafficLightColor,后者是握有这些值的对象 object TrafficLightColorTest extends Enumeration { type TrafficLightColorTest = Value val Red, Yellow, Green = Value } //这样,枚举的类型变成了 TrafficLightColor.TrafficLightColor 但仅当你使用import语句时这样做才显得有意义 import TrafficLightColorTest._ def doWhat(color: TrafficLightColorTest) = { if (color == Red) "stop" else if (color == Yellow) "hurry up" else "go" } //枚举值的ID可通过id方法返回,名称通过toString方法返回 //对TrafficLightColor.values的调用输出所有枚举值的集 for (c <- TrafficLightColor.values) println(c.id + ": " + c) //通过枚举的ID或名称来进行查找定位,以下两段代码都输出 TrafficLightColor.Red对象 TrafficLightColorTest(0) TrafficLightColorTest.withName("Red") }}
0 0