Xtend の紹介プログラミング生放送勉強会 第23回@大阪SQLWorld お だ
自己紹介• 織田 信亮• 大阪で開発者しています• SQLWorld の代表です• http://d.hatena.ne.jp/odashinsuke/• Twitter:@shinsukeoda
今日は
DB の話し
しません
何で?
Xtend• THE BETTER JAVA• http://www.eclipse.org/xtend/index.html• Eclipse Foundation からリリース• 現在 V 2.4系• IDE は Eclipse• コンパイ...
どんな人にお薦め?• Eclipse 使って Java 書いてる• Java 書く必要があるけど、面倒~• GWT(Google Web Toolkit) 使ってる?• Java で Android 開発してる?GWT と Android 開発...
他の JVM 言語との違い• 多くの JVM 言語 (Groovy, Scala, …)• バイトコード(.class)を生成• Xtend• ソースコード(.java)を生成
環境構築• Eclipse があると楽ちん• Eclipse Marketplace からダウンロード• Java Project に add Library で XtendLibrary以上!• Maven だけでも可• 但し、実装は Ecl...
コード紹介Java Xtendpublic class JavaMain {public static void main(String... args) {System.out.println("Hello, World");}}class ...
コード紹介Java Xtendfinal Order order = new Order();order.setMinShippingTime(new Date());order.setTotalAmount(BigDecimal.ZERO);...
コード紹介Java Xtendorder.setTotalAmount(order.getTotalAmount().add(unitPrice.multiply(quantity)));order.totalAmount = order.to...
公式ドキュメントに沿って• http://www.eclipse.org/xtend/documentation.html• なるべく Java と違うとこを中心に• 発表者は、v2.3 と v2.4 を使ってます。
Introduction• Extension methods• Lambda Expresions• ActiveAnnotations• Operator overloading• Powerful switch expressions• ...
Reference Document• Java Interoperability• Classes and Members• Expressions• Active Annotations
Java Interoperabilityclasspath に あれば Java の型は全部使えるよ• JDBC Driver for SQL Server もOK!• Type Inference• 型推論あるから Java よりタイプ量減...
Classes and Members• Package Declarion• “^” でエスケープ出来る• Java のキーワードと被ってたら .java でコンパイルエラー• “;” 省略可能package hoge.^val // pac...
Classes and Members• Imports• “^” でエスケープ• static import は “*” でしか出来ないimport hoge.^val.AAAimport static java.util.Collectio...
Classes and Members• Class Declaration• アクセス修飾子は既定で public• constructors, fields, methods, annotations を書ける• inner class は...
Class and Members• Constructors• Java と違って new で宣言• 既定で public• public, protected, package, private が指定可能class MyClass ext...
Java と Xtend のアクセス修飾子比較Java Xtendpublic publicprotected protectedprivate privatepackage private package
Classes and Members• Fields• 既定 で private• public, protected, package, private が指定可能• val/var で型推論。(val は final, var は not...
Classes and Members• Methods• def で宣言、既定 で public• public, protected, package, private が指定可能• return 書かない場合は、最後の式の結果が返るdef...
Classes and Members• Methods• static も可能• 可変長引数 も可能def static MyClass createInstance() {new MyClass}def void printAll(Stri...
Classes and Members• Methods• 戻り値の型は省略可能• abstract method や 再帰的なmethod は明示的に書く必要ありdef String first(List<String> elements) ...
Classes and Members• Methods• abstract method• 実装を書かないと abstract 扱い。abstract class/interface で宣言可能。戻り値は推論出来ないので、型を指定する。abs...
Classes and Members• Methods• 例外• チェック例外の catch/throws を強制しないdef void throwException() throws Exception {throw new Excepti...
Classes and Members• Methods• Dispatch Method• ディスパッチの説明はここがいいよ• [雑記] 多重ディスパッチ (C# によるプログラミング入門)• http://ufcpp.net/study/c...
Classes and Membersprotected String _add(final int a, final String b) { … }protected String _add(final int a, final int b)...
Classes and Members• Annotations• Java と同じ@TypeAnnotation("hoge")class MyClass2 {@FieldAnnotation String myField@MethodAnn...
Classes and Members• Extension Methods• メソッドの第一引数をレシーバにして書ける• ObjectExtensions, IterableExtensions 等の Extension クラスが標準で 21...
Classes and Members• Extension Methods• ローカルメソッドも拡張メソッドとして書ける• 可視可能な 自クラス/継承元クラスの non-static メソッド• static メソッドは、import したら...
Classes and Members• Extension Methods• import• static の後に extension とつけるだけ• static メソッドは、import したら拡張メソッドとして書けるimport sta...
Classes and Members• Extension Methods• Extension Provider• フィールド, ローカル変数, パラメータ に extension を付けると、それらのインスタンスメソッドは、拡張メソッドと...
Classes and Members• Interface• V2.4 で追加。Java と一緒• フィールドは、static finalinterface MyInterface<T> extends OtherInterface {val...
Expressions• Annotation• V2.4 で追加。若干 Java と違うJava Xtendpublic @interface MyAnnotation {public String[] value();public bool...
Classes and Members• Enum• V2.4 で追加。まだ残念な感じ• Java では書ける、コンストラクタ, フィールド, メソッドの定義が出来ないenum MyColor {GREEN,BLUE}
Classes and Members• Enum (Java なら…)public enum MyColor {GREEN("緑") {@Override public int[] toRGB() { return new int[] { 0...
Expressions全部式だよ。if や for, try-catch とかも式• Literals• String• “ or „ で囲む。Java と違って 改行 OKHello Xtend!"Hello Xtend!"Hello "Xt...
Expressions• Literals• Char• String と同じで明示的に型指定された場合で、1文字の時val char a = aval char b = "b"
Expressions• Literals• Number• int, long(L), BigInteger(BI), double(D or none), float(F),BigDecimal(BD)-421_234_567_8900xb...
Expressions• Literals• Boolean, Null, Type• Type は Java と違う。 typeof(クラス名)• Java の場合は、 Class.classval t = trueval f = false...
Expressions• Literals• Collection• mutable と immutable がある// mutableval myList = newArrayList(Hello, World)val myMap = new...
Expressions• Literals• Array• Collection と同じ書き方でも、明示的に型指定すると Array になる• 若干癖があるval String[] myArray = #["aaa", "bbb"] // Co...
Expressions• Type Casts• Java と違って as Type で変換• 変換出来ないと null が返るsomeThing as MyClass42 as Integer
Expressions• Operator overloading• 演算子をメソッドに変換して実現val x = 2.71BDval y = 3.14BDval sum = x + y // BigDecimalExtension.opera...
Expressions• Operator overloading演算子 メソッドe1 += e2 e1.operator_add(e2)e1 -= e2 e1.operator_remove(e2)e1 || e2 e1.operator_o...
Expressions• Operator overloading• Java と比べて幾つか注意が必要なのがある• ++, --, +=, -=• インクリメント, デクリメント は定義されていないので使えない• +=, -= は プリミティ...
Expressions• Operator overloading• Equality Operators• ==, != は Object.equals に変換• ===, !== は Java の ==, != と同じvar a = "ab...
Expressions• Operator overloading• Comparsion Operators• <, >, <=, >=• プリミティブな数値、java.lang.Comparable が対象• Arithemetic Ope...
Expressions• Operator overloading• Elvis Operator• 左辺が null の時、右辺を返す• 次紹介しますが、v2.4 から ショートサーキット になりましたdef String getOrCrea...
Expressions• Operator overloading• Short-Circuit Boolean Operators• ||, &&, ?: はショートサーキット• ?: は 2.4 系から ショートサーキット扱いdef Str...
Expressions• Operator overloading• With Operator• => doubleArrowval item = new Pronama => [place = "大阪"number = 23speakers...
Expressions• Operator overloading• Range Operators• .. , ..< , ..>• Pair Operator• a -> b で Pair<K, V> にfor (i : 0 ..< lis...
Expressions• Blocks• { } で囲まれた箇所• 最後の式の戻り値が Block の戻り値となる• 値が返らない場合は、void• Variable• 変数宣言は Block の中だけ• 外側の Block の変数を シャドー...
Expressions• Method Invocation• 空の () は省略可能• Implicit Validables this and it• 変数/仮引数名 に “it” を付けると• “it” は特別にシャドーイングが許可されて...
Expressions• Static Access• Java と違ってパッケージやクラスの区切りが ::MyClass::myStaticFieldorg::apache::commons::lang3::StringUtils::defa...
Expressions• Null-Safe Feature Call• ?. で null チェック込 の呼び出し• 呼び出すメソッド/プロパティ等の戻り値が プリミティブ型 の場合は要注意!(null が無いので、今のところ初期値(0, f...
Expressions• Lambda Expressionsfinal JTextField textField = new JTextField();textField.addActionListener(new ActionListene...
Expressions• Lambda Expressions• パラメータの型は推論出来る• パラメータが1個の場合は省略可(パラメータ名は“it”)val textField = new JTextFieldtextField.addAct...
Expressions• Lambda Expressions• ラムダの中で this は外側のクラスのインスタンスを指す• 自身のインスタンスを指す場合は、”self” を使うabstract class Hoge {protected d...
Expressions• Lambda Expressions• Typing• ラムダは Function/Procedure に変換されるval toUpperCaseFunction =[ String s | s.toUpperCase...
Expressions• If• 戻り値は、if, else の戻り値の共通の型になる• Java の3項演算子(predicate ? then : else)は無いval num = if (true) BigDecimal::ZERO e...
Expressions• Switch• Java と結構違う!• フォールスルー無し (break 要らず)• 何でも使える (Java だと int/Integer/String/Enum のみ)• case で指定した値/式 が bool...
Expressions• Switch• Type guards• case に型を指定することも出来る。指定した型しか case の条件を判定しないdef isNullOrEmpty(Object target) {switch target...
Expressions• Loop全部 戻り値無し(void)• For• for (T1 value : arrayOrIterable) expression• 変数の型(T1) は推論可能• While Loop• while (pred...
Expressions• Return• メソッドかラムダ式の戻り値に使う。ブロックは、最後の式の結果が戻り値になる• Throwing• Java と一緒。戻り値無し(void)
Expressions• Try, Catch, Finally• 戻り値を返す以外は、Java とほぼ同じ• try と catch のどちらかの最後の式の結果が戻り値になる• Java7 で入った try-with-recources は無...
Expressions• Template• 3つの‟(シングルクォート)で囲った箇所がテンプレート• 自動で値が適用された文字列になる• 変数/式の記述は «» で囲む。• Eclipse plugin により、ctrl + shift + ...
Expressions• Template• テンプレート式は、メソッドのボディにもなる• 条件分岐/ループ も書ける• IF/ELSEIF/ELSE/ENDIF• FOR/ENDFOR オプションで BEFORE/SEPARATOR/AFTE...
Active Annotations• Xtend => Java への変換に介入出来る。• Java の Annotation Processor に近い感覚• 標準でも 2つ 用意されている• @Property : フィールドに設定すると...
Active Annotations• GWT で活用している方がいますGwt and Xtendhttp://www.slideshare.net/sefftinge/gwt-and-xtendActive Annotation を使ったGW...
まとめ• Java 書いてる人にはお薦め• Java と Xtend 混在しているとか普通• v2.3 には interface とか無かったし• Xtend で書けない物は仕方なしで 直接 Java で書く• たまに若干足りないなーと思う事も...
参考資料• 公式サイトhttp://www.eclipse.org/xtend/index.html• Bloghttp://blog.efftinge.de/• SlideShareWeb Development with GWT and X...
Xtend の紹介
Upcoming SlideShare
Loading in …5
×

Xtend の紹介

1,605 views

Published on

http://atnd.org/events/40204
プログラミング生放送勉強会 第23回@大阪

Published in: Technology, Education

Xtend の紹介

  1. 1. Xtend の紹介プログラミング生放送勉強会 第23回@大阪SQLWorld お だ
  2. 2. 自己紹介• 織田 信亮• 大阪で開発者しています• SQLWorld の代表です• http://d.hatena.ne.jp/odashinsuke/• Twitter:@shinsukeoda
  3. 3. 今日は
  4. 4. DB の話し
  5. 5. しません
  6. 6. 何で?
  7. 7. Xtend• THE BETTER JAVA• http://www.eclipse.org/xtend/index.html• Eclipse Foundation からリリース• 現在 V 2.4系• IDE は Eclipse• コンパイルするには 2 つ方法がある• Eclipse• Maven
  8. 8. どんな人にお薦め?• Eclipse 使って Java 書いてる• Java 書く必要があるけど、面倒~• GWT(Google Web Toolkit) 使ってる?• Java で Android 開発してる?GWT と Android 開発は、未体験なので?マークJava 書いてる人が対象!!
  9. 9. 他の JVM 言語との違い• 多くの JVM 言語 (Groovy, Scala, …)• バイトコード(.class)を生成• Xtend• ソースコード(.java)を生成
  10. 10. 環境構築• Eclipse があると楽ちん• Eclipse Marketplace からダウンロード• Java Project に add Library で XtendLibrary以上!• Maven だけでも可• 但し、実装は Eclipse 使う方が楽• 生成される .java をリアルタイムで確認出来る
  11. 11. コード紹介Java Xtendpublic class JavaMain {public static void main(String... args) {System.out.println("Hello, World");}}class XtendMain {def static void main(String... args) {println("Hello, World")}}そんな変わらない!使う必要あんの?
  12. 12. コード紹介Java Xtendfinal Order order = new Order();order.setMinShippingTime(new Date());order.setTotalAmount(BigDecimal.ZERO);val order = new Order => [minShippingTime = new DatetotalAmount = BigDecimal::ZERO]ちょっと読みやすい?!
  13. 13. コード紹介Java Xtendorder.setTotalAmount(order.getTotalAmount().add(unitPrice.multiply(quantity)));order.totalAmount = order.totalAmount +unitPrice * quantityだいぶ良いやん!
  14. 14. 公式ドキュメントに沿って• http://www.eclipse.org/xtend/documentation.html• なるべく Java と違うとこを中心に• 発表者は、v2.3 と v2.4 を使ってます。
  15. 15. Introduction• Extension methods• Lambda Expresions• ActiveAnnotations• Operator overloading• Powerful switch expressions• No statements• Properties• Type inference• Full support for Java generics• Translates to Java not bytecode
  16. 16. Reference Document• Java Interoperability• Classes and Members• Expressions• Active Annotations
  17. 17. Java Interoperabilityclasspath に あれば Java の型は全部使えるよ• JDBC Driver for SQL Server もOK!• Type Inference• 型推論あるから Java よりタイプ量減るよ• Convertion Rules• Auto boxing• Arrays  List<E>• Lambda  Functions/Procedures
  18. 18. Classes and Members• Package Declarion• “^” でエスケープ出来る• Java のキーワードと被ってたら .java でコンパイルエラー• “;” 省略可能package hoge.^val // package hoge.val
  19. 19. Classes and Members• Imports• “^” でエスケープ• static import は “*” でしか出来ないimport hoge.^val.AAAimport static java.util.Collections.*
  20. 20. Classes and Members• Class Declaration• アクセス修飾子は既定で public• constructors, fields, methods, annotations を書ける• inner class は NG• class に指定出来る修飾子は public, abstract, final, static• protected とか無理。static も今のところ意味なしpackage pronama.osakaimport java.io.Serializableclass MyClass extends Number implements Serializable {…}
  21. 21. Class and Members• Constructors• Java と違って new で宣言• 既定で public• public, protected, package, private が指定可能class MyClass extends AnotherClass {new(String s, int n) { super(s, n) }new(String s) { this(s, 0) }new() { this("default") }}
  22. 22. Java と Xtend のアクセス修飾子比較Java Xtendpublic publicprotected protectedprivate privatepackage private package
  23. 23. Classes and Members• Fields• 既定 で private• public, protected, package, private が指定可能• val/var で型推論。(val は final, var は not final)class MyClass {int count = 1static boolean debug = falsevar name = foo // 型推論 String 型val UNIVERSAL_ANSWER = 42 // 型推論 int 型}
  24. 24. Classes and Members• Methods• def で宣言、既定 で public• public, protected, package, private が指定可能• return 書かない場合は、最後の式の結果が返るdef String first(List<String> elements) {elements.get(0)}def private void hoge() {}package def void fuga() {}
  25. 25. Classes and Members• Methods• static も可能• 可変長引数 も可能def static MyClass createInstance() {new MyClass}def void printAll(String... strings) {strings.forEach [ s | println(s) ]}
  26. 26. Classes and Members• Methods• 戻り値の型は省略可能• abstract method や 再帰的なmethod は明示的に書く必要ありdef String first(List<String> elements) {elements.get(0)}// 戻り値の型を省略して書けるdef first(List<String> elements) {elements.get(0)}
  27. 27. Classes and Members• Methods• abstract method• 実装を書かないと abstract 扱い。abstract class/interface で宣言可能。戻り値は推論出来ないので、型を指定する。abstract class MyAbstractClass {def normalMethod() {return 1}def String abstMethod()}
  28. 28. Classes and Members• Methods• 例外• チェック例外の catch/throws を強制しないdef void throwException() throws Exception {throw new Exception}def void sneakyThrowException() {// Java だと Exception はチェック例外なので、// throws を付けないとダメthrow new Exception}def void runThrowException() {throwException// Java だと try-catch か throws のどちらかが必要}
  29. 29. Classes and Members• Methods• Dispatch Method• ディスパッチの説明はここがいいよ• [雑記] 多重ディスパッチ (C# によるプログラミング入門)• http://ufcpp.net/study/csharp/sp4_multipledispatch.htmldef dispatch String add(int a, String b) { … }def dispatch String add(int a, int b) { … }def dispatch String add(String a, int b) { … }def dispatch String add(String a, String b) { … }
  30. 30. Classes and Membersprotected String _add(final int a, final String b) { … }protected String _add(final int a, final int b) { … }protected String _add(final String a, final int b) { … }protected String _add(final String a, final String b) { … }public String add(final Object a, final Object b) {if (a instanceof Integer && b instanceof Integer) {return _add((Integer)a, (Integer)b);} else if (a instanceof Integer && b instanceof String) {return _add((Integer)a, (String)b);} else if (a instanceof String && b instanceof Integer) {return _add((String)a, (Integer)b);} else if (a instanceof String && b instanceof String) {return _add((String)a, (String)b);} else {throw new IllegalArgumentException("…");}}
  31. 31. Classes and Members• Annotations• Java と同じ@TypeAnnotation("hoge")class MyClass2 {@FieldAnnotation String myField@MethodAnnotation(children = #[ @MyAnno(true), @MyAnno ])def void meMethod(@ParameterAnnotation String param) {}}
  32. 32. Classes and Members• Extension Methods• メソッドの第一引数をレシーバにして書ける• ObjectExtensions, IterableExtensions 等の Extension クラスが標準で 21 個用意されているlistOfStrings.map [ toUpperCase ]// calls ListExtensions.<T, R>map(List<T> list, Function<? super T, ? extends R> mapFunction)"hello".toFirstUpper// calls StringExtensions.toFirstUpper("hello")
  33. 33. Classes and Members• Extension Methods• ローカルメソッドも拡張メソッドとして書ける• 可視可能な 自クラス/継承元クラスの non-static メソッド• static メソッドは、import したら拡張メソッドとして書けるclass MyClass2 {def doSomething(Object obj) { // do something}def extensionCall(Object obj) {obj.doSomething // calls this.doSomething(obj)}}
  34. 34. Classes and Members• Extension Methods• import• static の後に extension とつけるだけ• static メソッドは、import したら拡張メソッドとして書けるimport static extension java.util.Collections.*new MyClass().singletonList()// calls Collections.singletonList(new MyClass())
  35. 35. Classes and Members• Extension Methods• Extension Provider• フィールド, ローカル変数, パラメータ に extension を付けると、それらのインスタンスメソッドは、拡張メソッドとして書ける• static との違いは、実装の差し替えが容易!class MyClass {extension Repository rep = Factory::get(typeof(Repository))def save(User u) {u.store // calls rep.store(u);}def save(User u, extension Repository repParam) {u.store // calls repParam.store(u);}}
  36. 36. Classes and Members• Interface• V2.4 で追加。Java と一緒• フィールドは、static finalinterface MyInterface<T> extends OtherInterface {val CONSTANT = 42def T doStuff(String... args) throws SomeException}
  37. 37. Expressions• Annotation• V2.4 で追加。若干 Java と違うJava Xtendpublic @interface MyAnnotation {public String[] value();public boolean isTricky() default false;public int[] lotteryNumbers()default { 42, 137 };}annotation MyAnnotation {String[] valueboolean isTricky = falseint[] lotteryNumbers =#[42, 137]}
  38. 38. Classes and Members• Enum• V2.4 で追加。まだ残念な感じ• Java では書ける、コンストラクタ, フィールド, メソッドの定義が出来ないenum MyColor {GREEN,BLUE}
  39. 39. Classes and Members• Enum (Java なら…)public enum MyColor {GREEN("緑") {@Override public int[] toRGB() { return new int[] { 0, 255, 0 }; }},BLUE("青") {@Override public int[] toRGB() { return new int[] { 0, 0, 255 }; }};public final String japaneseName;MyColor(String jpn) {japaneseName = jpn;}public abstract int[] toRGB();}
  40. 40. Expressions全部式だよ。if や for, try-catch とかも式• Literals• String• “ or „ で囲む。Java と違って 改行 OKHello Xtend!"Hello Xtend!"Hello "Xtend"!Hello "Xtend"!"Hello Xtend!""HelloXtend!"HelloXtend
  41. 41. Expressions• Literals• Char• String と同じで明示的に型指定された場合で、1文字の時val char a = aval char b = "b"
  42. 42. Expressions• Literals• Number• int, long(L), BigInteger(BI), double(D or none), float(F),BigDecimal(BD)-421_234_567_8900xbeef#l // 16進数 long077 // 77 not octal <= これ間違いで 8進数扱いの 6342d // double0.42e2f // float 指数表記0.123_456_789e2000bd // BigDecimal 指数表記
  43. 43. Expressions• Literals• Boolean, Null, Type• Type は Java と違う。 typeof(クラス名)• Java の場合は、 Class.classval t = trueval f = falseval String s = nullval clazz = typeof(java.lang.String)// java.lang.String.classval clazz2 = typeof(int[]) // int[].class
  44. 44. Expressions• Literals• Collection• mutable と immutable がある// mutableval myList = newArrayList(Hello, World)val myMap = newLinkedHashMap(a -> 1, b -> 2)// immutableval myList2 = #[ Hello, World ]val mySet = #{ Hello, World }val myMap2 = #{ a -> 1, b -> 2 }
  45. 45. Expressions• Literals• Array• Collection と同じ書き方でも、明示的に型指定すると Array になる• 若干癖があるval String[] myArray = #["aaa", "bbb"] // Collection と同じ書き方val String[] myArray2 = newArrayOfSize(400)val int[] intArray = newIntArrayOfSize(400)val byte[] b = #[1, 2, 3] // 型が違うとのコンパイルエラーになるval byte[] b = #[1.byteValue, 2.byteValue, 3.byteValue]
  46. 46. Expressions• Type Casts• Java と違って as Type で変換• 変換出来ないと null が返るsomeThing as MyClass42 as Integer
  47. 47. Expressions• Operator overloading• 演算子をメソッドに変換して実現val x = 2.71BDval y = 3.14BDval sum = x + y // BigDecimalExtension.operator_plus(x,y)def Date operator_plus(Date a, int day) {val c = Calendar::instancec.time = ac.add(Calendar::DATE, day)c.time}val nextDay = new Date + 1
  48. 48. Expressions• Operator overloading演算子 メソッドe1 += e2 e1.operator_add(e2)e1 -= e2 e1.operator_remove(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_tripleEquals(e2)*他にもたくさんあるから公式ドキュメント見てね
  49. 49. Expressions• Operator overloading• Java と比べて幾つか注意が必要なのがある• ++, --, +=, -=• インクリメント, デクリメント は定義されていないので使えない• +=, -= は プリミティブな数値では Java と意味合いが異なるvar x = 1x += 2 // コンパイルエラー int 2つを引数にとる// operator_add は無い// また実装したとしても 第一引数の値を書き換えることは出来ないval y = x++ // コンパイルエラー// インクリメント/デクリメントは演算子として使えない
  50. 50. Expressions• Operator overloading• Equality Operators• ==, != は Object.equals に変換• ===, !== は Java の ==, != と同じvar a = "abc"var b = a + "def"println(b == "abcdef") // trueprintln(b === "abcdef") // false
  51. 51. Expressions• Operator overloading• Comparsion Operators• <, >, <=, >=• プリミティブな数値、java.lang.Comparable が対象• Arithemetic Operators• +, -, *, /, **if (42 > myNumber) { }if (startDate < arrivalDate) { }
  52. 52. Expressions• Operator overloading• Elvis Operator• 左辺が null の時、右辺を返す• 次紹介しますが、v2.4 から ショートサーキット になりましたdef String getOrCreate(String id) {return id ?: getNewId // id が null なら getNewId の結果が返る}def String getNewId() {println("getNewId")return UUID::randomUUID.toString}
  53. 53. Expressions• Operator overloading• Short-Circuit Boolean Operators• ||, &&, ?: はショートサーキット• ?: は 2.4 系から ショートサーキット扱いdef String getOrCreate(String id) {return id ?: getNewId // id が null なら getNewId が実行される// ショートサーキットじゃない時は null じゃなくても実行された。}def String getNewId() {println("getNewId")return UUID::randomUUID.toString}
  54. 54. Expressions• Operator overloading• With Operator• => doubleArrowval item = new Pronama => [place = "大阪"number = 23speakers = #[new Speaker => [ name = "@murajun1978" ],new Speaker => [ name = "@shinsukeoda" ],new Speaker => [ name = "@uniunix" ],new Speaker => [ name = "@chuki" ]]]
  55. 55. Expressions• Operator overloading• Range Operators• .. , ..< , ..>• Pair Operator• a -> b で Pair<K, V> にfor (i : 0 ..< list.size) { }for (i : list.size >.. 0) { }(10..25).contains(17) // trueval b = 1 -> "a" // Pair<Integer, String>
  56. 56. Expressions• Blocks• { } で囲まれた箇所• 最後の式の戻り値が Block の戻り値となる• 値が返らない場合は、void• Variable• 変数宣言は Block の中だけ• 外側の Block の変数を シャドーイング 出来ない• “it” は 例外で、シャドーイング 出来る• var で宣言した変数は、ラムダの中からアクセス不可
  57. 57. Expressions• Method Invocation• 空の () は省略可能• Implicit Validables this and it• 変数/仮引数名 に “it” を付けると• “it” は特別にシャドーイングが許可されている• ラムダで便利• “it” と this が被ったら?• “it” が優先val it = new Pronamaplace = 大阪 // it.setPlace("大阪");
  58. 58. Expressions• Static Access• Java と違ってパッケージやクラスの区切りが ::MyClass::myStaticFieldorg::apache::commons::lang3::StringUtils::defaultString("hoge")
  59. 59. Expressions• Null-Safe Feature Call• ?. で null チェック込 の呼び出し• 呼び出すメソッド/プロパティ等の戻り値が プリミティブ型 の場合は要注意!(null が無いので、今のところ初期値(0, false)が入る)• Constructor Call• Java と一緒。違うのは、空の括弧()は省略可if (myRef != null) { myRef.doStuff() }myRef?.doStuff // myRef が null の場合、null が返る。
  60. 60. Expressions• Lambda Expressionsfinal JTextField textField = new JTextField();textField.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {textField.setText("Something happend!");}});val textField = new JTextFieldtextField.addActionListener([ ActionEvent e |textField.text = "Something happend!"])
  61. 61. Expressions• Lambda Expressions• パラメータの型は推論出来る• パラメータが1個の場合は省略可(パラメータ名は“it”)val textField = new JTextFieldtextField.addActionListener([textField.text = "Something happend!"])
  62. 62. Expressions• Lambda Expressions• ラムダの中で this は外側のクラスのインスタンスを指す• 自身のインスタンスを指す場合は、”self” を使うabstract class Hoge {protected def end() { }def void execute()}val Hoge hoge = [ |self.end // self 付けないと、外側のクラスの end メソッドを使う。// 定義されていない場合は、コンパイルエラー]
  63. 63. Expressions• Lambda Expressions• Typing• ラムダは Function/Procedure に変換されるval toUpperCaseFunction =[ String s | s.toUpperCase ] // (String) => Stringval (String) => String stringToStringFunction = [ toUpperCase ]val Function1<? super String, ? extends String> same = [ toUpperCase ]val stringToStringFunction2 = [ String s | s.toUpperCase ]
  64. 64. Expressions• If• 戻り値は、if, else の戻り値の共通の型になる• Java の3項演算子(predicate ? then : else)は無いval num = if (true) BigDecimal::ZERO else 5l// num is Numberval obj = if (false) "abc" else 19// obj is Comparable<? & Serializable>String name = firstName != null ?firstName + " " + lastName : lastName;var name =if (firstName != null) firstName + + lastNameelse lastName
  65. 65. Expressions• Switch• Java と結構違う!• フォールスルー無し (break 要らず)• 何でも使える (Java だと int/Integer/String/Enum のみ)• case で指定した値/式 が boolean の場合はその結果を使う• boolean では無い場合は、Object.equals を使うval result = switch myString {case myString.length > 5 : "長い文字列"case "何か" : "何か 文字列"default : "他の文字列"}
  66. 66. Expressions• Switch• Type guards• case に型を指定することも出来る。指定した型しか case の条件を判定しないdef isNullOrEmpty(Object target) {switch target {CharSequence case target.length === 0: trueCollection<?> case target.empty: truecase target === null: truedefault: false}}
  67. 67. Expressions• Loop全部 戻り値無し(void)• For• for (T1 value : arrayOrIterable) expression• 変数の型(T1) は推論可能• While Loop• while (predicate) expression• Do-While Loop• do expression while (predicate)
  68. 68. Expressions• Return• メソッドかラムダ式の戻り値に使う。ブロックは、最後の式の結果が戻り値になる• Throwing• Java と一緒。戻り値無し(void)
  69. 69. Expressions• Try, Catch, Finally• 戻り値を返す以外は、Java とほぼ同じ• try と catch のどちらかの最後の式の結果が戻り値になる• Java7 で入った try-with-recources は無い!val data = try {readData} catch (Throwable e) {"処理失敗"} finally {// 後処理}
  70. 70. Expressions• Template• 3つの‟(シングルクォート)で囲った箇所がテンプレート• 自動で値が適用された文字列になる• 変数/式の記述は «» で囲む。• Eclipse plugin により、ctrl + shift + < で入力可能。• ソースファイル(.xtend)の文字コードを UTF-8 にする• 変数/式の戻り値が null / void の場合は、空文字となるval name = "プロ生大阪"println(«name» へようこそ!) // プロ生大阪 へようこそ
  71. 71. Expressions• Template• テンプレート式は、メソッドのボディにもなる• 条件分岐/ループ も書ける• IF/ELSEIF/ELSE/ENDIF• FOR/ENDFOR オプションで BEFORE/SEPARATOR/AFTER• 大文字じゃないとコンパイルエラーdef welcomeString(String name) «name» へようこそ!
  72. 72. Active Annotations• Xtend => Java への変換に介入出来る。• Java の Annotation Processor に近い感覚• 標準でも 2つ 用意されている• @Property : フィールドに設定すると、プロパティを生成する• C# の自動実装プロパティに近い感覚。(アクセス修飾子の変更は出来ない)• @Data : クラスに設定すると、イミュータブルなデータクラスを生成する
  73. 73. Active Annotations• GWT で活用している方がいますGwt and Xtendhttp://www.slideshare.net/sefftinge/gwt-and-xtendActive Annotation を使ったGWT のコード生成デモ
  74. 74. まとめ• Java 書いてる人にはお薦め• Java と Xtend 混在しているとか普通• v2.3 には interface とか無かったし• Xtend で書けない物は仕方なしで 直接 Java で書く• たまに若干足りないなーと思う事もある• inner class/protected class 書きたい時とか• でもタイプ量が圧倒的に減るので我慢出来る
  75. 75. 参考資料• 公式サイトhttp://www.eclipse.org/xtend/index.html• Bloghttp://blog.efftinge.de/• SlideShareWeb Development with GWT and Xtendhttp://www.slideshare.net/sefftinge/gwt-and-xtendGWTでわかるかもしれないXtendの魅力(第8回ファントムタイプ勉強会)http://www.slideshare.net/yusukekokubo9/8xtendgwt

×