13. 動的型付けの例
Integer
num
=
"Hello"
//=>
GroovyCastException:
Cannot
cast
object
'Hello'
with
class
'java.lang.String'
to
class
'java.lang.Integer'
groovycでコンパイルには成功する
しかし、実行すると例外が発生する
65. 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の組み合わせのエイリアス