Xtendを触ってみる その4 拡張メソッド

今日はXtendの目玉機能の1つである拡張メソッドについて紹介します。
これは任意のメソッドを、そのメソッドの第一引数の型のオブジェクトをレシーバとして呼び出せるというものです。文章だけだとわかりにくいと思うのでサンプルコードを書いてみます。

def sayHello(String s){
  println("Hello " + s + "!")
}

というメソッドを定義しておくと、このメソッドを以下のようにStringオブジェクトのメソッドとして呼び出すことができるというわけです。

"World".sayHello()

元のメソッドに第二引数以降がある場合、拡張メソッド呼び出しの引数として指定します。

def sayHello(String s, int times){
  var i = 0
  while((i = i + 1) < times){
    println("Hello " + s + "!")
  }
}

"World".sayHello(10)

Stringクラス自体は一切拡張せずにメソッドを追加できるという点がポイントです。Scalaの暗黙的型変換を使った擬似的な型の拡張に似ていますが、Xtendの拡張メソッドのほうがやっていることはずっと単純(単なるシンタックスシュガー)で直感的です。また、必要に応じてそのコンテキスト(というかそのクラス内)でのみ有効な拡張を行うことができる、という利点もあります。実際には拡張メソッドからは対象の型のprivateやprotectedなメンバには触れないのでできることは限られますが、面白い機能です。
今回は拡張メソッドとあわせてディスパッチメソッドについても紹介しようと思っていたのですが、ちょっと長くなりそうなので次回にしたいと思います。
というわけで今日はここまで。続きます。