One-Way
爱一人,攀一山,追一梦

一、单例对象

Scala没有静态方法或静态字段,可以用object来达到相同的目的

  object Account{
    private var num = 0
    def number() ={ num += 1; num}
  }

  println(Account.number())
  println(Account.number())

结果

1
2

在Scala中可以用对象来实现:

  • 作为存放工具函数或常量的地方
  • 高效的共享单个不可变实例
  • 需要用单个实例来协调某个服务(单例模式)

 

二、伴生对象

如果用到即有实例方法又有静态方法的类,在scala中,你可以通过类和与类同名的 "伴生" 对象来达到同样的目的。

类和它的伴生对象可以互相访问私有特性。它们必须存在于同一个源文件中。

  class Account{
    val id = Account.number()
    println(id)
  }

  object Account{
    private var num = 0
    def number() ={ num += 1; num}
  }

  println(Account.number())
  println(Account.number())
  val c = new Account()

结果

1
2
3

 

三、扩展类或特质的对象

 

 

四、apply方法

Array(100) 和 new Array(100)

Array(100)  调用的是apply(100),  Array[Int]单个元素100;

new Array(100) 调用的是构造器 this(100), Array[Nothing] 包含100个null元素;

apply方法通常返回的是伴生类的对象。

 

五、应用程序对象

每个scala程序必须从一个对象的main开始

object Test {
    def main(args: Array[String]) {
        println("Hello")
    }
}

除了这种方式,也可以扩展App特质

object Test extends App{
    println("Hello")    
}
object Test extends App{
  if(args.length>0)
    println("Hello,"+args(0))
  else
    println("Hello World")
}

通过args获取命令行参数

$scalac Hello.scala
$scala -Dscala.time Hello Fred
Hello, Fred
[total 4ms]

指定参数scala.time,程序退出时会显示使用的时间

 

六、枚举

  object color extends Enumeration{
    //val Red,Green,Yellow = Value
    val Red = Value(0,"stop") //id为0 name为stop
    val Yellow = Value(10)   //id为10 name为Yellow
    val Green = Value("go") //id为11 name为go
  }

  for(i<-color.values) println(i.id+" "+i)

  println(color(0))
  println(color.withName("stop"))

结果

0 stop
10 Yellow
11 go
stop
stop

 

 

 

4.

    class Point(val x:Int,val y:Int){
    }

    object Point{
      def apply(x:Int,y:Int)= new Point(x,y)
    }

    val p = Point(3,4)
    println(p.x)

5.

object Chapter6 extends App{
  for(i<- (0 until args.length).reverse) println(args(i))
}

6.

  object Poker extends Enumeration{
    val one = Value(1,"1")
    val two = Value(2,"2")
    val three = Value(3,"3")
    val four = Value(4,"4")
  }
  for(c<- Poker.values) println(c.id +":"+c.toString)

7.

  object Poker extends Enumeration{
    val one = Value(1,"1")
    val two = Value(2,"2")
    val three = Value(3,"3")
    val four = Value(4,"4")
  }
  for(c<- Poker.values) println(c.id +":"+c.toString)

  import Poker._
  def check(pok : Poker.Value): Unit ={
    if (pok == one) println("Yes")
  }
  check(one)

 

 

 

参考《快学Scala》

posted on 2016-08-23 18:15  单行道|  阅读(597)  评论(0编辑  收藏  举报