Introduction Xtend

  • 2,247 views
Uploaded on

Indroduction Xtend, …

Indroduction Xtend,
Extending Java,
Statically typed, Closure,
Extension method

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • 面白かったし、参考になった。
    Are you sure you want to
    Your message goes here
    Be the first to like this
No Downloads

Views

Total Views
2,247
On Slideshare
0
From Embeds
0
Number of Embeds
7

Actions

Shares
Downloads
17
Comments
1
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Introduction A language made for Java developers. @quicy
  • 2. Xtendとは● Eclipseからリリースされている● 新しいJVM言語● 少ない学習コストで● 静的型で安全に● Javaをより簡潔に● Javaをより強力に
  • 3. Xtendとは● Javaプロジェクトで一緒に使う● Xtendクラス → Javaクラスに変換● interface, enum, annotationなどは 全部Javaのまま
  • 4. XtendとはXtend == Java + α != 新言語 Javaのエクステンション
  • 5. Hello Xtendclass HelloXtend { def static void main(String[] args) { println(Hello Xtend) }}
  • 6. Hello Closureimport java.util.Listimport static extension java.util.Collections.*class HelloClosure { def static void main(String[] _) { println(positiveOnly(newArrayList(1, 5, 2, -10, 4))) } def static positiveOnly(List<Integer> values) { values.filter [it > 0] }}
  • 7. リアルタイムなJavaソース生成
  • 8. Xtendのメリット● 静的型● 高い表現力● Javaの型システムをそのまま使える● IDEによる賢い補完
  • 9. Javaをより簡潔に● 型推論● プロパティアクセス● 演算子オーバロード● 全てが「式」
  • 10. Javaをより強力に● クロージャ● 拡張メソッド● 強力なswitch式● マルチプル・ディスパッチ● テンプレート式● Xtend全体がJavaのシュガー
  • 11. Scalaでいいんじゃん?● Scala使える状況ならScala使おう!
  • 12. Xtend/いつ/なぜ?● Javaソースが必要なとき (契約、GWT、etc...)● Javaプログラマが 少ない学習コストで 今日からすぐに 開発/保守を効率化するとき
  • 13. Xtendの開発環境● Eclipse + Xtend (☆Marketplace)● 1. Javaプロジェクトを普通に作成● 2. Xtend Classを作る● 3. Quick Fixでライブラリを導入● 4. あとはXtendクラスを書くだけ● 5. 自動的にJavaソースに変換される※ Mavenでもビルドできます
  • 14. 型推論~変数val List<String> names = getTheListOfNames()val names = getTheListOfNames()※ 変数の型は省略できる
  • 15. 型推論~forループfor (String name : getTheListOfNames())for (name : getTheListOfNames())※ 変数の型は省略できる
  • 16. 型推論~リターン型def List<String> getTheListOfNames() { newArrayList("Tomte","Pippi","Carlson")}def getTheListOfNames() { newArrayList("Tomte","Pippi","Carlson")}※ リターン型は省略できる
  • 17. 型推論~クロージャ・パラメータgetTheListOfNames().map(String name | "Mr. "+name)getTheListOfNames().map(name | "Mr. "+name)※ パラメータ型は省略できる
  • 18. プロパティ・アクセスperson.getName()person.nameperson.setName("Foo")person.name = "Foo"obj.compute()obj.compute※ プロパティをより自然に扱える
  • 19. 演算子オーバロードval apples = newArrayList(new Apple())val oranges = newArrayList(new Orange())val fruits = apples + oranges※ 演算子の意味を多重定義できる
  • 20. 演算子の種類(1)e1 += e2 e1.operator_add(e2)e1 || e2 e1.operator_or(e2)e1 && e2 e1.operator_and(e2)e1 == e2 e1.operator_equals(e2)e1 != e2 e1.operator_notEquals(e2)e1 < e2 e1.operator_lessThan(e2)e1 > e2 e1.operator_greaterThan(e2)e1 <= e2 e1.operator_lessEqualsThan(e2)e1 >= e2 e1.operator_greaterEqualsThan(e2)e1 -> e2 e1.operator_mappedTo(e2)
  • 21. 演算子の種類(2)e1 .. e2 e1.operator_upTo(e2)e1 + e2 e1.operator_plus(e2)e1 - e2 e1.operator_minus(e2)e1 * e2 e1.operator_multiply(e2)e1 / e2 e1.operator_divide(e2)e1 % e2 e1.operator_modulo(e2)e1 ** e2 e1.operator_power(e2)! e1 e1.operator_not()- e1 e1.operator_minus()
  • 22. すべてが「式」val data = if (file.exists) { fileContentsToString(file) } else { has no data }※ 文じゃないから評価結果が値になる※ caseやtry~catchも式です
  • 23. 拡張メソッド~ローカル拡張class Printer { def void print(Person person) { println(person.fullName) } def getFullName(Person p) { p.firstName + " " + p.lastName }}クラスにメソッドを外部から追加するイメージで呼び出せるようになる
  • 24. 拡張メソッド~Injectclass Printer { @Inject extension PersonExtension def print(Person person) { println( person.fullName ) }}※ 外部定義された拡張をDIで適用する
  • 25. 拡張メソッド~static importimport static extension java.util.Collections.*静的拡張ライブラリを使える。コレクションや文字列の拡張が便利。高階関数+クロージャが超強力!
  • 26. クロージャ(1)~ブロックval names = people.map [ p | p.name ]※ コレクション処理がとても簡単に
  • 27. クロージャ(2)~ラムダ式val predicate = [Person person | "Hans" == person.name]people.filter(predicate)※ ラムダ式で生成した関数を 高階関数に渡せる
  • 28. クロージャ(3)~簡略化people.filter[ Person p | "Hans" == p.name ]people.filter[ p | "Hans" == p.name ]people.filter[ "Hans" == it.name ]people.filter[ "Hans" == name ]※ 型推論や暗黙itパラメータで簡略化
  • 29. クロージャ(4)~Builder DSLhtml [ head [ title [$("XML encoding with Xtend")] ] body [ h1 [$("XML encoding with Xtend")] p [$("this dsl can be used as alternative to XML")]※ BuilderなどのDSLとしても有効
  • 30. テンプレート式val fullName = Name: «p.firstName» «p.lastName»def getFullName(Person p) Fist name: «p.firstName» Last name: «p.lastName»※ テンプレート文字列を簡単に作れる※ IF/FORなどの制御構造も埋め込める
  • 31. Switch式val Shape shape = ...val desc = switch (shape) { Rectangle case shape.width == shape.height : "Square ("+shape.width+")" Rectangle : "Rectangle ("+shape.width+" x "+shape.height+")" Circle : "Circle ("+shape.diameter+")" default : "Dont know"}※ 型ガードと条件検査を同時にできる
  • 32. マルチプル・ディスパッチdef example() { val Shape s = new Rectangle() println(s.label)}def dispatch label(Shape s) { "some shape"}def dispatch label(Rectangle r) { ← "a rectangle"}※ 実行時の型でメソッドが選択される
  • 33. どんどん進化中!● 言語機能もIDEも、まだ少し力不足● 開発が活発です● ちょっと足りないなと思うものも、 次々に実装されていきます
  • 34. +1● 開発者がイケメン● Sven Efftingeさん素敵です
  • 35. Xtendのまとめ● 少ない学習コストで● 静的型で安全に● Javaをより簡潔に● Javaをより強力に