本文比较一下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》