本文比較一下Java和Scala語言的關鍵字
Java關鍵字
Java一共有50個關鍵字(keywords),其中有2個是保留字,目前還不曾用到:goto和const。true、false和null看起來很像關鍵字,但實際上只是字面量而已。本文粗略的把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,從而解放了switch和default關鍵字。而Scala的for循環和Java的for循環也大相徑庭。Scala雖然有while和do-while循環,但是裏面不能用break和continue,所以這兩個關鍵字也解放了。
參考資料
《Programming in Scala》第二版
《Scala for the Impatient》