SlideShare une entreprise Scribd logo
1  sur  76
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
• コンパイルするには 2 つ方法がある
• Eclipse
• Maven
どんな人にお薦め?
• Eclipse 使って Java 書いてる
• Java 書く必要があるけど、面倒~
• GWT(Google Web Toolkit) 使ってる?
• Java で Android 開発してる?
GWT と Android 開発は、
未体験なので?マーク
Java 書いてる人が対象!!
他の JVM 言語との違い
• 多くの JVM 言語 (Groovy, Scala, …)
• バイトコード(.class)を生成
• Xtend
• ソースコード(.java)を生成
環境構築
• Eclipse があると楽ちん
• Eclipse Marketplace からダウンロード
• Java Project に add Library で Xtend
Library
以上!
• Maven だけでも可
• 但し、実装は Eclipse 使う方が楽
• 生成される .java をリアルタイムで確認出来る
コード紹介
Java Xtend
public class JavaMain {
public static void main(String... args) {
System.out.println("Hello, World");
}
}
class XtendMain {
def static void main(String... args) {
println("Hello, World")
}
}
そんな変わらない!
使う必要あんの?
コード紹介
Java Xtend
final Order order = new Order();
order.setMinShippingTime(new Date());
order.setTotalAmount(BigDecimal.ZERO);
val order = new Order => [
minShippingTime = new Date
totalAmount = BigDecimal::ZERO
]
ちょっと読みやすい?!
コード紹介
Java Xtend
order.setTotalAmount(
order.getTotalAmount().add(
unitPrice.multiply(quantity)));
order.totalAmount = order.totalAmount +
unitPrice * quantity
だいぶ良いやん!
公式ドキュメントに沿って
• http://www.eclipse.org/xtend/documenta
tion.html
• なるべく Java と違うとこを中心に
• 発表者は、v2.3 と v2.4 を使ってます。
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
Reference Document
• Java Interoperability
• Classes and Members
• Expressions
• Active Annotations
Java Interoperability
classpath に あれば Java の型は全部使えるよ
• JDBC Driver for SQL Server もOK!
• Type Inference
• 型推論あるから Java よりタイプ量減るよ
• Convertion Rules
• Auto boxing
• Arrays  List<E>
• Lambda  Functions/Procedures
Classes and Members
• Package Declarion
• “^” でエスケープ出来る
• Java のキーワードと被ってたら .java でコンパイ
ルエラー
• “;” 省略可能
package hoge.^val // package hoge.val
Classes and Members
• Imports
• “^” でエスケープ
• static import は “*” でしか出来ない
import hoge.^val.AAA
import static java.util.Collections.*
Classes and Members
• Class Declaration
• アクセス修飾子は既定で public
• constructors, fields, methods, annotations を書ける
• inner class は NG
• class に指定出来る修飾子は public, abstract, final, static
• protected とか無理。static も今のところ意味なし
package pronama.osaka
import java.io.Serializable
class MyClass extends Number implements Serializable {
…
}
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") }
}
Java と Xtend のアクセス修飾子比較
Java Xtend
public public
protected protected
private private
package private package
Classes and Members
• Fields
• 既定 で private
• public, protected, package, private が指定可能
• val/var で型推論。(val は final, var は not final)
class MyClass {
int count = 1
static boolean debug = false
var name = 'foo' // 型推論 String 型
val UNIVERSAL_ANSWER = 42 // 型推論 int 型
}
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() {}
Classes and Members
• Methods
• static も可能
• 可変長引数 も可能
def static MyClass createInstance() {
new MyClass
}
def void printAll(String... strings) {
strings.forEach [ s | println(s) ]
}
Classes and Members
• Methods
• 戻り値の型は省略可能
• abstract method や 再帰的なmethod は明示的に書く必要あり
def String first(List<String> elements) {
elements.get(0)
}
// 戻り値の型を省略して書ける
def first(List<String> elements) {
elements.get(0)
}
Classes and Members
• Methods
• abstract method
• 実装を書かないと abstract 扱い。abstract class/interface で宣言
可能。戻り値は推論出来ないので、型を指定する。
abstract class MyAbstractClass {
def normalMethod() {
return 1
}
def String abstMethod()
}
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 のどちらかが必要
}
Classes and Members
• Methods
• Dispatch Method
• ディスパッチの説明はここがいいよ
• [雑記] 多重ディスパッチ (C# によるプログラミング入門)
• http://ufcpp.net/study/csharp/sp4_multipledispatch.html
def 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) { … }
Classes and Members
protected 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("…");
}
}
Classes and Members
• Annotations
• Java と同じ
@TypeAnnotation("hoge")
class MyClass2 {
@FieldAnnotation String myField
@MethodAnnotation(children = #[ @MyAnno(true), @MyAnno ])
def void meMethod(@ParameterAnnotation String param) {}
}
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")
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)
}
}
Classes and Members
• Extension Methods
• import
• static の後に extension とつけるだけ
• static メソッドは、import したら拡張メソッドとして書ける
import static extension java.util.Collections.*
new MyClass().singletonList()
// calls Collections.singletonList(new MyClass())
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);
}
}
Classes and Members
• Interface
• V2.4 で追加。Java と一緒
• フィールドは、static final
interface MyInterface<T> extends OtherInterface {
val CONSTANT = 42
def T doStuff(String... args) throws SomeException
}
Expressions
• Annotation
• V2.4 で追加。若干 Java と違う
Java Xtend
public @interface MyAnnotation {
public String[] value();
public boolean isTricky() default false;
public int[] lotteryNumbers()
default { 42, 137 };
}
annotation MyAnnotation {
String[] value
boolean isTricky = false
int[] lotteryNumbers =
#[42, 137]
}
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, 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();
}
Expressions
全部式だよ。if や for, try-catch とかも式
• Literals
• String
• “ or „ で囲む。Java と違って 改行 OK
'Hello Xtend!'
"Hello Xtend!"
'Hello "Xtend"!'
'Hello "Xtend"!'
"Hello 'Xtend'!"
"Hello
Xtend!"
'Hello
Xtend'
Expressions
• Literals
• Char
• String と同じで明示的に型指定された場合で、1文字の時
val char a = 'a'
val char b = "b"
Expressions
• Literals
• Number
• int, long(L), BigInteger(BI), double(D or none), float(F),
BigDecimal(BD)
-42
1_234_567_890
0xbeef#l // 16進数 long
077 // 77 not octal <= これ間違いで 8進数扱いの 63
42d // double
0.42e2f // float 指数表記
0.123_456_789e2000bd // BigDecimal 指数表記
Expressions
• Literals
• Boolean, Null, Type
• Type は Java と違う。 typeof(クラス名)
• Java の場合は、 Class.class
val t = true
val f = false
val String s = null
val clazz = typeof(java.lang.String)
// java.lang.String.class
val clazz2 = typeof(int[]) // int[].class
Expressions
• Literals
• Collection
• mutable と immutable がある
// mutable
val myList = newArrayList('Hello', 'World')
val myMap = newLinkedHashMap('a' -> 1, 'b' -> 2)
// immutable
val myList2 = #[ 'Hello', 'World' ]
val mySet = #{ 'Hello', 'World' }
val myMap2 = #{ 'a' -> 1, 'b' -> 2 }
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]
Expressions
• Type Casts
• Java と違って as Type で変換
• 変換出来ないと null が返る
someThing as MyClass
42 as Integer
Expressions
• Operator overloading
• 演算子をメソッドに変換して実現
val x = 2.71BD
val y = 3.14BD
val sum = x + y // BigDecimalExtension.operator_plus(x,y)
def Date operator_plus(Date a, int day) {
val c = Calendar::instance
c.time = a
c.add(Calendar::DATE, day)
c.time
}
val nextDay = new Date + 1
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)
*他にもたくさんあるから公式ドキュメント見てね
Expressions
• Operator overloading
• Java と比べて幾つか注意が必要なのがある
• ++, --, +=, -=
• インクリメント, デクリメント は定義されていないので使えない
• +=, -= は プリミティブな数値では Java と意味合いが異なる
var x = 1
x += 2 // コンパイルエラー int 2つを引数にとる
// operator_add は無い
// また実装したとしても 第一引数の値を書き換えることは出来ない
val y = x++ // コンパイルエラー
// インクリメント/デクリメントは演算子として使えない
Expressions
• Operator overloading
• Equality Operators
• ==, != は Object.equals に変換
• ===, !== は Java の ==, != と同じ
var a = "abc"
var b = a + "def"
println(b == "abcdef") // true
println(b === "abcdef") // false
Expressions
• Operator overloading
• Comparsion Operators
• <, >, <=, >=
• プリミティブな数値、java.lang.Comparable が対象
• Arithemetic Operators
• +, -, *, /, **
if (42 > myNumber) { }
if (startDate < arrivalDate) { }
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
}
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
}
Expressions
• Operator overloading
• With Operator
• => doubleArrow
val item = new Pronama => [
place = "大阪"
number = 23
speakers = #[
new Speaker => [ name = "@murajun1978" ],
new Speaker => [ name = "@shinsukeoda" ],
new Speaker => [ name = "@uniunix" ],
new Speaker => [ name = "@chuki" ]
]
]
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) // true
val b = 1 -> "a" // Pair<Integer, String>
Expressions
• Blocks
• { } で囲まれた箇所
• 最後の式の戻り値が Block の戻り値となる
• 値が返らない場合は、void
• Variable
• 変数宣言は Block の中だけ
• 外側の Block の変数を シャドーイング 出来ない
• “it” は 例外で、シャドーイング 出来る
• var で宣言した変数は、ラムダの中からアクセス不可
Expressions
• Method Invocation
• 空の () は省略可能
• Implicit Validables this and it
• 変数/仮引数名 に “it” を付けると
• “it” は特別にシャドーイングが許可されている
• ラムダで便利
• “it” と this が被ったら?
• “it” が優先
val it = new Pronama
place = '大阪' // it.setPlace("大阪");
Expressions
• Static Access
• Java と違ってパッケージやクラスの区切りが ::
MyClass::myStaticField
org::apache::commons::lang3::StringUtils::defaultString("hoge")
Expressions
• Null-Safe Feature Call
• ?. で null チェック込 の呼び出し
• 呼び出すメソッド/プロパティ等の戻り値が プリミティブ型 の場合
は要注意!(null が無いので、今のところ初期値(0, false)が入る)
• Constructor Call
• Java と一緒。違うのは、空の括弧()は省略可
if (myRef != null) { myRef.doStuff() }
myRef?.doStuff // myRef が null の場合、null が返る。
Expressions
• Lambda Expressions
final JTextField textField = new JTextField();
textField.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
textField.setText("Something happend!");
}
});
val textField = new JTextField
textField.addActionListener([ ActionEvent e |
textField.text = "Something happend!"
])
Expressions
• Lambda Expressions
• パラメータの型は推論出来る
• パラメータが1個の場合は省略可(パラメータ名は“it”)
val textField = new JTextField
textField.addActionListener([
textField.text = "Something happend!"
])
Expressions
• Lambda Expressions
• ラムダの中で this は外側のクラスのインスタンスを指す
• 自身のインスタンスを指す場合は、”self” を使う
abstract class Hoge {
protected def end() { }
def void execute()
}
val Hoge hoge = [ |
self.end // self 付けないと、外側のクラスの end メソッドを使う。
// 定義されていない場合は、コンパイルエラー
]
Expressions
• Lambda Expressions
• Typing
• ラムダは Function/Procedure に変換される
val toUpperCaseFunction =
[ String s | s.toUpperCase ] // (String) => String
val (String) => String stringToStringFunction = [ toUpperCase ]
val Function1<? super String, ? extends String> same = [ toUpperCase ]
val stringToStringFunction2 = [ String s | s.toUpperCase ]
Expressions
• If
• 戻り値は、if, else の戻り値の共通の型になる
• Java の3項演算子(predicate ? then : else)は無い
val num = if (true) BigDecimal::ZERO else 5l
// num is Number
val obj = if (false) "abc" else 19
// obj is Comparable<? & Serializable>
String name = firstName != null ?
firstName + " " + lastName : lastName;
var name =
if (firstName != null) firstName + ' ' + lastName
else lastName
Expressions
• Switch
• Java と結構違う!
• フォールスルー無し (break 要らず)
• 何でも使える (Java だと int/Integer/String/Enum のみ)
• case で指定した値/式 が boolean の場合はその結果を使う
• boolean では無い場合は、Object.equals を使う
val result = switch myString {
case myString.length > 5 : "長い文字列"
case "何か" : "何か 文字列"
default : "他の文字列"
}
Expressions
• Switch
• Type guards
• case に型を指定することも出来る。指定した型しか case の条件
を判定しない
def isNullOrEmpty(Object target) {
switch target {
CharSequence case target.length === 0: true
Collection<?> case target.empty: true
case target === null: true
default: false
}
}
Expressions
• Loop
全部 戻り値無し(void)
• For
• for (T1 value : arrayOrIterable) expression
• 変数の型(T1) は推論可能
• While Loop
• while (predicate) expression
• Do-While Loop
• do expression while (predicate)
Expressions
• Return
• メソッドかラムダ式の戻り値に使う。ブロックは、最後の式
の結果が戻り値になる
• Throwing
• Java と一緒。戻り値無し(void)
Expressions
• Try, Catch, Finally
• 戻り値を返す以外は、Java とほぼ同じ
• try と catch のどちらかの最後の式の結果が戻り値になる
• Java7 で入った try-with-recources は無い!
val data = try {
readData
} catch (Throwable e) {
"処理失敗"
} finally {
// 後処理
}
Expressions
• Template
• 3つの‟(シングルクォート)で囲った箇所がテンプレート
• 自動で値が適用された文字列になる
• 変数/式の記述は «» で囲む。
• Eclipse plugin により、ctrl + shift + < で入力可能。
• ソースファイル(.xtend)の文字コードを UTF-8 にする
• 変数/式の戻り値が null / void の場合は、空文字となる
val name = "プロ生大阪"
println('''«name» へようこそ!''') // プロ生大阪 へようこそ
Expressions
• Template
• テンプレート式は、メソッドのボディにもなる
• 条件分岐/ループ も書ける
• IF/ELSEIF/ELSE/ENDIF
• FOR/ENDFOR オプションで BEFORE/SEPARATOR/AFTER
• 大文字じゃないとコンパイルエラー
def welcomeString(String name) '''«name» へようこそ!'''
Active Annotations
• Xtend => Java への変換に介入出来る。
• Java の Annotation Processor に近い感覚
• 標準でも 2つ 用意されている
• @Property : フィールドに設定すると、プロパティを生成する
• C# の自動実装プロパティに近い感覚。(アクセス修飾子の変更は出来ない)
• @Data : クラスに設定すると、イミュータブルなデータクラスを生成する
Active Annotations
• GWT で活用している方がいます
Gwt and Xtend
http://www.slideshare.net/sefftinge/gwt-and-xtend
Active Annotation を使った
GWT のコード生成デモ
まとめ
• Java 書いてる人にはお薦め
• Java と Xtend 混在しているとか普通
• v2.3 には interface とか無かったし
• Xtend で書けない物は仕方なしで 直接 Java で書く
• たまに若干足りないなーと思う事もある
• inner class/protected class 書きたい時とか
• でもタイプ量が圧倒的に減るので我慢出来る
参考資料
• 公式サイト
http://www.eclipse.org/xtend/index.html
• Blog
http://blog.efftinge.de/
• SlideShare
Web Development with GWT and Xtend
http://www.slideshare.net/sefftinge/gwt-and-xtend
GWTでわかるかもしれないXtendの魅力(第8回ファントムタイプ勉強会)
http://www.slideshare.net/yusukekokubo9/8xtendgwt

Contenu connexe

Tendances (9)

Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Javaプログラミング入門【第5回】
Javaプログラミング入門【第5回】Javaプログラミング入門【第5回】
Javaプログラミング入門【第5回】
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programming
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 

Similaire à Xtend の紹介

TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
 

Similaire à Xtend の紹介 (20)

Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそ
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
Java研修
Java研修Java研修
Java研修
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
JavaLearning_1.pptx
JavaLearning_1.pptxJavaLearning_1.pptx
JavaLearning_1.pptx
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
pi-13. 今までの総まとめ
pi-13. 今までの総まとめpi-13. 今までの総まとめ
pi-13. 今までの総まとめ
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 

Plus de Oda Shinsuke

Plus de Oda Shinsuke (20)

SQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdfSQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdf
 
What's hyperscale
What's hyperscaleWhat's hyperscale
What's hyperscale
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tips
 
Sql server 2019 ざっくり紹介
Sql server 2019  ざっくり紹介Sql server 2019  ざっくり紹介
Sql server 2019 ざっくり紹介
 
Spark on sql server?
Spark on sql server?Spark on sql server?
Spark on sql server?
 
SQL Server のロック概要
SQL Server のロック概要SQL Server のロック概要
SQL Server のロック概要
 
Blazor 触ってみた
Blazor 触ってみたBlazor 触ってみた
Blazor 触ってみた
 
Linux + PHP でも SQL Server
Linux + PHP でも SQL ServerLinux + PHP でも SQL Server
Linux + PHP でも SQL Server
 
グラフデータベースの話し
グラフデータベースの話しグラフデータベースの話し
グラフデータベースの話し
 
Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介
 
Sql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベースSql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベース
 
Transaction scopeまだダメ
Transaction scopeまだダメTransaction scopeまだダメ
Transaction scopeまだダメ
 
Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!
 
2016年を振り返って
2016年を振り返って2016年を振り返って
2016年を振り返って
 
Sql world とは
Sql world とはSql world とは
Sql world とは
 
開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り
 
Sql world とは
Sql world とはSql world とは
Sql world とは
 
Ms build 触ってみよう
Ms build 触ってみようMs build 触ってみよう
Ms build 触ってみよう
 
Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介
 
Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介
 

Dernier

Dernier (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

Xtend の紹介

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