探索Scala(8)-- 關鍵字

本文比較一下Java和Scala語言的關鍵字

Java關鍵字

Java一共有50個關鍵字keywords),其中有2個是保留字,目前還不曾用到:gotoconsttruefalsenull看起來很像關鍵字,但實際上只是字面量而已。本文粗略的把true、false和null也看做Java關鍵字,認爲Java一共有53個關鍵字。下面是大致歸類的Java關鍵字列表:

  • assert
  • boolean, byte, short, char, int, long, float, double, void
  • package, import, class, interface, enum, implements, extends
  • public, protected, private, abstract, static, final, volatile, transient, synchronized, strictfp, native
  • try, catch, finally, throw, throws
  • if, else, do, while, for, switch, case, default, break, continue, return
  • super, this
  • new, instanceof
  • const, goto
  • true, false, null

Scala關鍵字

Scala只有39個關鍵字:

  • package, import, class, object, trait, extends, with, type, forSome
  • private, protected, abstract, sealed, final, implicit, lazy, override
  • try, catch, finally, throw
  • if, else, match, case, do, while, for, return, yield
  • def, val, var 
  • this, super
  • new
  • true, false, null

對比Java和Scala關鍵字

爲了直觀的對比Java和Scala的關鍵字列表,我畫了下面這張圖:

Java和Scala共有的關鍵字

Java和Scala共有的關鍵字,在兩個語言裏的含義也基本相同。只有一個例外:case。在Java裏,case主要用在switch-case語句裏。Scala沒有switch-case語句,case關鍵字主要用來定義case類和進行模式匹配

只有Java纔用到的關鍵字

共有28個Java關鍵字沒有被Scala採用,但Scala也是要運行在JVM上的,所以下面來看一下這28個關鍵字所表達的含義是如何在Scala裏實現的。

assert

scala.Predef定義了assert()方法,如下所示:

object Predef {
    @elidable(ASSERTION)
    def assert(assertion: Boolean) {
        if (!assertion)
            throw new java.lang.AssertionError("assertion failed")
    }

    @elidable(ASSERTION) @inline
    final def assert(assertion: Boolean, message: => Any) {
        if (!assertion)
            throw new java.lang.AssertionError("assertion failed: "+ message)
    }
}

boolean, byte, char, short, int, long, float, double

Scala沒有primitive類型,取而代之的是相應的類:Boolean、Byte、Char、Short、Int、Long、Float和Double。具體請看這篇文章

void

和primitive類型類似,Scala使用了更加OO的方式來表達void:Unit類。具體請看這篇文章

interface和implements

Scala用Trait取代了接口,具體請看這篇文章

static

Scala沒有static概念,取而代之的是單例對象。具體請看這篇文章

public

在Scala裏,類、方法、字段等,默認就是public,而且Scala也不允許將它們顯式設置爲public,所以public這個單詞沒有任何特殊含義,可以自由使用。

const和goto

const和goto不再是保留字,可以自由使用。

throws

Scala拋棄了Checked Exception,以及throws關鍵字。

native、transient、volatile和strictfp

取代這4個關鍵字的,是4個註解:scala.native、scala.transient、scala.volatile和scala.annotation.strictfp。下面是示例代碼:

@transient var t = 1
@volatile var v = 1

@strictfp
def f() = {}

@native
def n(x: Int): Int;

synchronized

Scala提供了synchronized方法,用起來幾乎和Java的synchronized關鍵字一樣:

def sync() = {
    this.synchronized {
        val x = 2
    }
}
但實際上並沒有什麼synchronized方法,反編譯之後,上面的Scala代碼和下面的Java代碼一模一樣:

public void sync() {
    synchronized(this) {
        ...
    }
}

instanceof

取而代之的是isInstanceOf[]方法,代碼如下所示:

def instanceof(arg: Any) = {
    if (arg.isInstanceOf[String]) {
        val str = arg.asInstanceOf[String]
    }
}

enum

在Scala裏,如果想定義枚舉,應該繼承scala.Enumeration,比如下面這段代碼:

object Color extends Enumeration {
    val Red = Value
    val Green = Value
    val Blue = Value
}

break, continue, default, switch

如前所述,Scala用模式匹配取代了switch-case,從而解放了switchdefault關鍵字。而Scala的for循環和Java的for循環也大相徑庭。Scala雖然有while和do-while循環,但是裏面不能用break和continue,所以這兩個關鍵字也解放了。

參考資料

《Programming in Scala》第二版

《Scala for the Impatient》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章