Scalaのなんでかな〜 constructor
Scalaのクラス定義がコンストラクターと一体になっている構文にとまどった方も多い(多くはいないかな?)のではないでしょうか。
私も最初何故このような構文なのかが分かりませんでした。
でも最近このconstructorが関数プログラミングとオブジェクト指向のうまい折衷案のような気がしています。
HaskellやOCamlなどのML系の言語では以下のような構文をよく使います。
def sumList(l:List[int]):int ={
def s(total:int,l:List[int]):int = l match{
case Nil => total;
case hd :: tl => s(total + hd,l);
}
s(0,l);
}
再帰呼び出しを多用するML系の言語ではこのようなNested Functionは必須です。
これをScalaのクラス定義に当てはめると次のようになります。
class Point(x:int,y:int){
def +(d:int) = new Point(x+d,y+d);
override def toString = "x:"+x+" y:"+y;
}
このPointクラスはコンストラクタで渡されたパラメータを「+」メソッド、「toString」メソッド内で直接参照することでimmutableクラスを端的に表すことができます。
immutableはML系の言語が重視している性質です。
こう考えるとScalaではimmutableなクラスが簡単に実現できて、かつ、varを使ってmmutableなクラスもJavaと同じように実現できる。