メインで使えなくてもScalaは活用できる
リリース物件にJavaしか使えないプロジェクトでも、開発環境としてScalaを使うことで、Javaだけ使うよりも開発効率を上げることができると思います。
開発環境でもScala使っちゃダメとかいうプロジェクトの場合は、あきらめるか、「僕が作ったんです!」とか言って押し切ってみるのはどうでしょう?(責任は持てません)
念のため、手元の環境は以下の通りです。※開発環境とは別です。
別のプロジェクトを作って参照
Eclipse上で、メインプロジェクトが"TheApp"という名前のJavaプロジェクトだとしたら、"TheApp+"という名前のScalaプロジェクトを作り、"TheApp+"ビルドパスのプロジェクト参照に"TheApp"を追加します。
"TheApp+"にScalaTestなりSpecs2なりを使って、好きなだけテストを書きます。Javaにも便利なテストツールはありますが、Scalaと比べるとJava自体の表現力が足枷になってしまいます。
他にも、Scalaで書くと簡単だけどJavaで書くのが面倒で自動生成が困難なクラスを、Scalaでミラー実装?したものと出力が常に同じになっていることをテストする、というやり方もあります。
ちなみに、Specs2のテストをまとめて実行する場合は、Javaの場合と同じように、新規作成→JUnitテストスイートでAllTestsを作って実行できます。むしろ、他の方法が分かりませんでした。
- AllTestsのイメージ
import org.junit.runner.*; import org.junit.runners.*; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({SomethingSpec.class, UtilSpec.class}) public class AllTests {}
テスト側には、
import org.specs2.runner.JUnitRunner import org.junit.runner.RunWith @RunWith(classOf[JUnitRunner]) class SomethingSpec extends Specification {
を付けます。
追記(2012-12-13): AllTestsをScalaで書いても良いですね。手書きになってしまいますけれど。
import org.junit.runner.RunWith import org.junit.runners.Suite import org.junit.runners.Suite.SuiteClasses @RunWith(classOf[Suite]) @SuiteClasses(Array(classOf[SomethingSpec], classOf[UtilSpec])) class AllTests
テスト以外にも使う
ScalaはDSLが書きやすかったり、パーサー機能が標準搭載されていたりと、テスト以外のツールとしても活用できると思います。
たとえば、自動生成ツールとか、コーディングルール独自チェックとかが比較的簡単に書けます。
Scalaだけで書くのが難しかったら、Javaと混合でもOKです。
他のスクリプト言語とかでも良いんじゃない?
実際、今の開発環境はスクリプト言語はPerlしか使えないので、解析や整形や自動生成などはJava(+Velocity他)とPerlなどを駆使してやっています。
なので、スクリプト言語を活用するのは、Javaだけ使うより良いです。
Scalaはこういった環境よりも、Javaとの親和性が高いので、もっと使いやすく、もっと効率アップが期待できる、と思っています。
弊害
Scalaを使えば使うほど、Javaで書くことが嫌になってしまうかもしれません。
*1:そろそろ4.2にしたいです。