Xtendを触ってみる その2 便利な機能あれこれ

今日はXtendの基本的な構文の中からJavaと比べた場合の便利機能を見てみます。
まずはプロパティへのアクセス。フィールドアクセスの構文でアクセサメソッド経由でのプロパティアクセスを行うことができます。

val p = new Person()
// p.setName("Naoki")と同じ
p.name = "Naoki"
// println(p.getName())と同じ
println(p.name)

val list = new ArrayList<String>()
// if(list.isEmpty()){...} と同じ
if(list.empty){
  ...
}

それと、引数が1つもないメソッドの呼び出しは()を省略することができます。

val list = new ArrayList<String>()
val size = list.size

通常メソッドは「レシーバ.メソッド名」で呼び出しますが、「レシーバ?.メソッド名」のようにすることでnull参照に対するメソッド呼び出しを安全に行うことができます。

// listがnullの場合はsizeはintの初期値(0)になる
val size = list?.size

Xtendの強力な機能の1つにswitchを使った強力な条件分岐があります。値でマッチさせたり、任意の条件式を指定したりすることができます。Javaと違ってbreakを書かなくてもマッチした以外の条件は適用されません。また、ifもそうですが、Xtendではすべてが式なのでswicthも戻り値を返します。

val result = switch myString {
  case myString.length > 5 : "a long string."
  case "foo" : "It's a foo."
  default : "It's a short non-foo string."
}

以下のように型でマッチさせることもできます。型でマッチさせた場合、処理部分ではキャストせずに該当の型として扱うことができます。

var Object x = ...
switch x {
  String case x.length() > 0 : x.length()
  List<?> : x.size()
  default : -1
}

今日はここまで。続きます。