何でかな〜 objectキーワード

私がScalaを使い始めて「何でかな〜」と奇異に感じるScalaの構文がいくつかあります。
しかし使い込んでいるうちになるほどね〜〜と感心するものも多くあります。

今回から何回かに分けてそのような構文をご紹介したいと思います。
(解釈は私の独断と偏見がかなり混じっていますのでその辺を割り引いて読んでください)

その第1回目が「object」キーワードです。
最初に「object」キーワードを見かけた時は何でこんなキーワードが存在するのか理解に苦しみました。

Singletonのオブジェクトを作るのにわざわざキーワードが必要なのか???

しかし、このキーワードは結構よく考えられておりなるほどね〜と感心させられることがあります。

Objectキーワードの役割を以下に示します。

 ・シングルトンオブジェクトの作成
 ・関数型プログラムの関数のようなメソッドの実現
 ・たった1つのオブジェクトでもMixinが可能
 ・Javaのstaticメソッドへの対応
 ・プログラムのエントリーポイントとしてのmainメソッドの置き場

この他にもあるかもしれませんが大体こんな所ではないでしょうか。


1.シングルトンオブジェクトの作成

 これはそのものズバリですね。
 ですがScalaを使い始めたころは「objcet A」を型のように扱ってコンパイ
 ラーによく怒られていました。objectでもメソッド定義できたりするので、
 どうしてもそれを型として特定したいしたくなることがあります。

2.関数型プログラムの関数のようなメソッドの作成
  
 私が一番感心したのがこのこの事です。
 関数型のプログラムでは当然ですがxxx.関数()のような表現は取りません。
 関数() といきなり関数が出てきます。
  
 オブジェクト指向と関数型のハイブリットの言語でかつ、JVMで動く言語で
 これをどのように実現するのかな? と思っていました。

 それが、objectキーワードをモジュールのように使うことでこれが、実現
 可能なことを知りびっくりしました。

  object A{ def abc()〜〜 }
---------------------------
import A
~~
abc() //オブジェクトを特定しないでメソッドを呼ぶ 
       実はimportでオブジェクトを特定

3.たった1つのオブジェクトでもMixinが可能
 
  これも驚きました。1つ1つのオブジェクト毎に機能を追加できるので、
  そのような煩雑なことをしたい場合はクラス設計が軽減されます。
  traitとベースとなるクラスを用意して組み合わせればいいので。

4.Javaのstaticメソッドへの対応

  Scalaにはstaticの概念が無いので、objectがその代わりに使われます。
  staticより便利な点としてはobjectだと変数に代入出来る事です。
  あまり機会は多くありませんが、必要な時には結構便利です。
  不確かですが、確かJavaから見るとobject指定した物はstaticのように
  見えていたと思います。

5.プログラムのエントリーポイントとしてのmainメソッドの置き場

  Scalaはobject内のmainメソッドがエントリーポイントになります。
  ちなみにApplicationクラスを継承するとmainメソッドなしでも実行可能です。

以上 objectキーワードはなかなか重要な役割を果たしています。