JavaからScalaへ
最近はScalaの勉強をしています。注目していたplayframeworkがバージョン2.0でJavaだけでなくScalaにも対応したという事が大きいですが、企業内においてもScalaを使ったアプリケーションの事例が増えてきているように感じます。
Scalaはコンパイルするとclassファイルが生成されJVM上で動作するためコンパイル後はほぼJavaと同じように扱う事ができます。また、Javaのクラスも呼び出す事が出来るためJavaの資産も活用できますし、またJavaの知識的な資産も有効に使えるところが多いと思います。
私がScalaが良いなと思っている点はScalaはJavaと同様に静的型付けだというところです。しかもScalaは静的型付けでありながら動的言語のようなクールな実装を提供してくれています。また、関数型言語のエッセンスも取り入れられていてまさにいいとこ取りの言語になっています。
Javaには言語仕様上抱えている問題がいくつかあるのですが、Scalaではその問題点の多くを解決してくれています。
プリミティブ型の問題
私がJavaの仕様で一番の課題と思っている点はプリミティブ型の存在です。Javaはオブジェクト指向言語でありながらプリミティブ型というオブジェクトでない型を持っています。プリミティブ型はオブジェクトではないため機能を持たせる事ができません。また、List等のオブジェクトを保有するようなクラスに値を設定する事も出来ません。そのためJavaではラッパークラスが提供されJavaSE5からはボクシングの機能によって暗黙的に相互変換されるようになりましたが比較演算子が思ったように動かない等の問題を抱えています。
ScalaではJavaではプリミティブ型とされているintやlongもすべてオブジェクトとして存在します。そのため単純な値であってもオブジェクト指向の概念で捉える事が出来ますし、多くの機能がメソッドとして提供され利用できます。Javaではパフォーマンス等を考慮した結果プリミティブ型といったオブジェクトでない型が導入された経緯がありますが、Scalaではコンパイル時においてプリミティブ型でも問題無いものについてはプリミティブ型として変換する事でパフォーマンス的な課題についてもある程度考慮されています。
冗長な定義の記載
Javaという言語はIDEというツールの存在が無いと開発には堪えない言語だと思っています。特に大きなところはインポート文やメソッドやフィールド等の宣言を行う部分です。Javaではソース内で利用しているすべてのクラスについてインポート文を記載して所在を明確にする必要がありますし、変数の定義についても明確にどのクラスなのかを記載する必要があります。
Scalaでは冗長な定義はすべて型推論で処理してくれます。メソッドから推論される型は明確なクラス名を定義せずにvalとだけ記載すれば良いですし、推測可能なクラスについてはimport文も書く必要はありません。
上記にあげたものはほんの一端ですが、Scalaは高機能なJavaとして大きなポテンシャルを持っていると感じています。
Scalaはまだ仕様が大きく変わっていてJavaほどバージョン間の互換性が保証されていないのでエンタープライズで利用するにはまだリスクが多い部分もあります。しかし、メソッドが無くなるような変更があったとしても静的型付けであることである程度コンパイラによって問題を見つける事ができるのは強みですし、今後仕様が安定してくれば徐々にエンタープライズでの利用も進んでくるのではないかと思っています。