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