高卒文系Scala vol.12 - エントリーポイント -

Scala本、4.4辺り。今回はScalaアプリケーションのエントリーポイントについて。

mainメソッド

エントリーポイントとは、Javaでいう「public static void main(String[] args)」メソッドに当たるもの。

Scalaでも、同じようなメソッドを定義します。

object Main {
  def main(args: Array[String]) : Unit = {
    args.foreach(println)
  }
}

シングルトンオブジェクトでエントリーポイントを定義します。

エントリーポイントと言っても、結局ただのメソッドなので、この例の場合だともっと簡単に書けます。

object Main {
  def main(args: Array[String]) = args.foreach(println)
}

Scalaアプリケーションを実行するときのコマンドは、Javaと同じようなもんです。

「javac」が「scalac」、「java」が「scala」に該当します。

この「Main」オブジェクトを「Main.scala」でファイルに保存して、

コマンドプロンプトからコンパイル、実行してみます。

scalac Main.scala



scala Main zetta 1985

実行結果

zetta
1985

「scalac」はコンパイラ起動時に毎回jarファイルを読み込むので時間がかかります。

「fsc」(fast scala compiler)コマンドでコンパイルすると、

初回起動時にデーモンを作成して、次回からのコンパイルの時間を短縮する事ができます。

Applicationトレイト

Scalaには、もう一つ、エントリーポイントを定義する方法があります。

エントリーポイントにしたいオブジェクトに、scala.Applicationトレイトを継承させると、

基準コンストラクタ内のコードが実行されます。

object Main2 extends Application{
  println("Application trait")
}

mainメソッドでの定義より簡単ですが、注意点が3つ。

  • 1. コマンドライン引数をプログラムで扱えない。(引数指定しても基準コンストラクタから参照できない)
  • 2. マルチスレッドアプリケーションが実行できない。(JVMの仕様らしい。いつか試してみる)
  • 3. 基準コンストラクタ内のコードが最適化されない。

以上の事から、Applicationトレイトによるエントリーポイントの定義は、

「プロダクトアプリケーションには使用せず、シングルスレッドのプログラミングを試したい場合のみに利用すべき」

・・・だそうです。

ScalaはJavaよりも色々と簡潔に書けるけど、エントリーポイントは横着しちゃいかん、という事ですねー

このエントリーをはてなブックマークに追加
comments powered by Disqus