Scalaを始めようと思っているJavaプログラマのための、JavaとScalaの予約語の違い

ScalaJavaってまぁまぁ見た目は似てて、同じ予約語も多いので、Java予約語を、Scalaの視点からみた場合に分類して簡単に解説してみました。分類の方法は独自だし、けっこう雑です。
Scala始めようと思ってるけど、Javaのあの予約語は、Scalaだと同じやつあるの?もしないなら、Scala予約語の、どれを使えばいいの?
っていうJavaプログラマ向けです。Javaプログラマにこそ、Scalaが普及して欲しいので。
完全に説明するのもめんどくさかったので、説明もなんか雑ですが・・・

同時に、以前scalaの予約語について書いたものがあるので、こっちも見るとよいかも。*1

だいだいJavaと同じ機能のモノ

特に説明の必要がないほど、ほぼJavaと同じ使い方するものはなにも書いてません。

catch
class

もちろんclassの定義に使うのは同じです。
が、Javaの場合

Class clazz = String.class;

という使い方をしますが、scalaで同じ事をする場合は、

val clazz = classOf[String]

というように、classOfという、型引数を一つだけとるメソッドを使います

do
extends
else
finally
while
return

省略できるから、あまり使わない。そもそも使わないで書くスタイルが推奨されると思われる。returnを書くと、メソッドの戻り値の型を省略できなくなる

throw
try
new
if
super

Javaと同じ予約語は存在するが、結構使い方違う、もしくは他の使い方が存在するもの

abstract

メソッドにはつけない(実装を持っていなければ、自動的にabstractなメソッドになるから)
classにつけるだけ

package

概念としては大体Javaと同じだが、ファイルの最初以外にも書ける機能があったり。

あとscalaには、package objectっていうモノのがあって、それにも使う。

for

ループではないですよ。メソッド呼び出しのシンタックスシュガーです。Javaの拡張forと似たようなことは出来るけど、全く別のものです。

case

javaと同じように、match式(javaのswitch文にあたるようなもの)の条件分岐で使うけど、その他の場所でもいっぱいつかう。*2

final

変数が再代入不可能ということを示す場合には、使用しない(その場合は、valという予約語つかう)
classが継承できないことを表したり、メソッドがオーバーライドできないことを示すことに使用する点はJavaと同じ

this

コンストラクタにつかったり、this.typeって使い方したりなど、ちょっとJavaと違う使い方が存在する。
Javaと同じく、自身のインスタンスを示す場合にもつかうけど

private

ちょっとJavaより機能豊富だったりする

protected

ちょっとJavaより機能豊富だったりする。
あと、Javaのprotectedって、同じpackage内からは参照できるけど、scalaの場合は参照できないっていう、細かい違いがある。

import

javaにない機能いっぱいある。

Javaのプリミティブの型名

scalaの場合、全部最初が大文字です。あとvoidはありません。

boolean
byte
char
double
float
int
long
short

同じようなものが、アノテーションや、メソッドとしてある

throws

アノテーション
http://www.scala-lang.org/api/current/scala/throws.html
scala自体には、チェック例外っていう概念がないので普通は使わない。
javaからscalaを呼び出すことを想定する場合につける。

break

scala.util.controlのしたに、一応あるけど、結局内部で例外投げてるだけだし、あまり使わないほうがいいと思う。ifやmatchが値を返したりするので、ある程度慣れれば、breakを使用しないで書けるようになる。
http://d.hatena.ne.jp/kmizushima/20091109/1257747528
http://www.scala-lang.org/api/current/scala/util/control/Breaks.html

instanceof

予約語ではなく、isInstanceOfっていうメソッドがある

synchronized

AnyRefのメソッド
http://www.scala-lang.org/api/current/scala/AnyRef.html

assert

Predefにメソッドとして同じ名前では定義されてるけど・・・

scalaには存在しないもの

const

そういえば、予約語でしたね・・・

goto

そういえば、こいつも予約語でしたね・・・

switch

switch文に似てるけど、すごく機能豊富なmatch式というのがあるので、それを使いましょう。

public

デフォルトで何もつけないと、スコープがpublicになるので、publicという予約語は存在しせん。

static

staticっていう概念自体がありません。初心者のうちは、staticにあたるものは、objectをつくって、そこに書くと思っていればいいでしょう。

implements

withつかいましょう

void

とりあえず、voidはUnitだと思っておけばよい

interface

trait使いましょう

enum

scala.Enumerationっていう、予約語ではなくclassがあり、これを使います。*3

default

defaultにあたるものを書きたい場合は、すべてにあてはまるパターンをmatch式の最後に書けばいいだけなので、この予約語はありません

continue

手続き型のプログラム非推奨にさせるためにわざとなくしてるっていうか、そもそもscalaのforが、javaのforと全く違うから、普通に同じ機能入れるの無理かな

strictfp

そういえば・・・アノテーションとしてもない・・・?これどうなってるんだっけ?(・ω・`)
気が向いたら調べて書く・・・

調べたところ、2.9からは、アノテーションとしてあるみたい

*1:これも説明大雑把だし、それぞれ他に詳しく説明されてるところがあるので、ちゃんとしりたい人は、他のサイトみたり、本読んだりしましょう(・ω・`) 

*2: おそらく、分類すると5箇所かな?ちゃんと言語仕様読んだわけではないけど。まえ分類してみたものがある

*3:しかし、バグがあり、使いづらくて、評判悪く、あまり使われてない・・・