まずはお約束のHelloWorld
前回は、
まずはその前に、
- ※注:Eclipse Xtend 2,2がリリースされました。コンストラクタやstaticメソッドは2.
2以降でしかサポートされないので、 2. 1以前をインストールしている場合は必ずアップデートしておきましょう。
プログラムのソースファイルも、

HelloWorld.
package jp.gihyo.toolbox.xtend
class HelloWorld {
def String sayHello(String name) {
var hello = "Hello "+name+"!"
hello
}
def static void main(String[] args) {
val HelloWorld hello = new HelloWorld()
println(hello.sayHello("Gihyo"))
}
}
Javaとの大きな違いは、
main()メソッドはJavaと同様にstatic修飾子を付けて作成します。実行方法もJavaプログラムと同様で、
このプログラムはJavaコードにコンパイルされ、
クロージャ
Xtendではクロージャを使うことができます。クロージャを作成するための文法は
val func = [String s | println(s)]
func.apply("Hello!") // "Hello!"を出力
クロージャを引数にとるメソッドや、
def myFunc1(ArrayList<String> names, (String) => String function){
val result = newArrayList()
for (n : names) {
result += function.apply(n)
}
return result
}
myFunc1()を実行するコードは次のようになります。namesに対するメソッド呼び出しのように見えますが、
var names = new ArrayList<String>()
names.add("Taro")
names.add("Jiro")
println(names.myFunc1(n | n.toUpperCase())) // "[TARO, JIRO]"を出力
println(names.myFunc1(n | n.toLowerCase())) // "[taro, jiro]"を出力
次の例は戻り値としてクロージャを返すメソッドmyFunc2()を定義したものです。引数を文字列にとり、
def (String) => String myFunc2(){
return [String name | "Hello " + name + "!"]
}
myFunc2()から返されたクロージャは、
println(myFunc2().apply("Gihyo")) // "Hello Gihyo!"を出力
拡張メソッド
Xtendには拡張メソッドと呼ばれる機能が用意されています。これは、
def hello(String name) {
println("Hello " + name + "!")
}
このhello()メソッドは、
"Gihyo".hello() // "Hello Gihyo!"を出力
もちろん、
プロパティへのアクセス
Xtendのオブジェクトがもつプロパティに対しては、
class Square {
private int width
private int height
def setWidth(int width) {
this.width = width
}
def getWidth() {
return this.width
}
def setHeight(int height) {
this.height = height
}
def getHeight() {
return this.height
}
def getArea() {
return this.width * this.height
}
}
このSquareクラスのインスタンスsquareを作った場合、
var square = new Square()
square.width = 20
square.height = 5
println("(" + square.width + ", " + square.height + ")") // "(20, 5)"を出力
もうひとつ注目したいのが、
println(square.getArea)
また、
println(square.area)
演算子オーバーロード
XtendではC++のように演算子をオーバーロードして独自の演算を定義できます。演算子オーバーロードを行うには、
次に示すVector2Dクラスでは、
package jp.gihyo.toolbox.xtend
class Vector2D {
double x
double y
// コンストラクタ
new(double x, double y) {
this.x = x
this.y = y
}
def Vector2D operator_plus(Vector2D v) {
return new Vector2D(this.x + v.x, this.y + v.y)
}
def Vector2D operator_minus(Vector2D v) {
return new Vector2D(this.x - v.x, this.y - v.y)
}
def Vector2D operator_multiply(double a) {
return new Vector2D(this.x * a, this.y * a)
}
override String toString() {
return "(" + this.x + ", " + this.y + ")"
}
}
このように演算子に対応したメソッドを定義しておくと、
val v1 = new Vector2D(10, 20)
val v2 = new Vector2D(5, 10)
println(v1 + v2) // "(15.0, 30.0)"を出力
println(v1 - v2) // "(5.0, 10.0)"を出力
println(v1 * 5) // "(50.0, 100.0)"を出力
ここで紹介した以外にも、