動的型付けの例
Integer
num
=
"Hello"
//=>
GroovyCastException:
Cannot
cast
object
'Hello'
with
class
'java.lang.String'
to
class
'java.lang.Integer'
groovycでコンパイルには成功する
しかし、実行すると例外が発生する
AST変換: @Immutable
@groovy.transform.Immutable
class
Sample
{
String
value
}
def
sample
=
new
Sample(value:
"HOGE")
sample.value
=
"変更できない"
//=>
groovy.lang.ReadOnlyPropertyException:
//
Cannot
set
readonly
property:
value
for
class:
Sample
66.
AST変換: @ToString, @EqualsAndHashCode,@TupleConstructors
@groovy.transform.TupleConstructor
@groovy.transform.ToString
@groovy.transform.EqualsAndHashCode
class
Sample
{
String
a
String
b
int
c
}
//
@TupleConstructorによって宣言したフィールドの順に引数を受け取るコンストラクタが生成される
def
sample
=
new
Sample("A",
"B",
3)
//
@ToStringによってそれっぽい文字列を構成するtoString()が生成される
println
sample.toString()
//
=>
Sample(A,
B,
3)
//
@EqualsAndHashCodeによって、プロパティの値をベースにした等値判定をするequals()が生成される
assert
sample
==
new
Sample("A",
"B",
3)
assert
sample
!=
new
Sample("A",
"B",
123)
//
もちろん、equals()の実装契約として必須であるhashCode()も合わせて実装されている
assert
sample.hashCode()
==
new
Sample("A",
"B",
3).hashCode()
assert
sample.hashCode()
!=
new
Sample("A",
"B",
123).hashCode()
//
(参考)
@Canonicalは、@ToStringと@EqualsAndHashCodeの組み合わせのエイリアス
Groovyスクリプト
//
in
hello.groovy
println
"Hello,
Script!"
//=>
Hello,
Script!
クラスの外側のルートレベルで直接コード
が書かれている=Groovyスクリプト
ちなみに、コンパイルされると、
Scriptクラスのインスタンスになる
public
class
hello
extends
groovy.lang.Script
{
public
static
transient
boolean
__$stMC;
public
hello();
public
hello(groovy.lang.Binding);
public
static
void
main(java.lang.String...);
public
java.lang.Object
run();
protected
groovy.lang.MetaClass
$getStaticMetaClass();
}