倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

GDK のコレクションがこんなに便利なわけがない。 (Collection 編8) 型変換

今回は GDK が Collection インターフェースに追加するクラスのうち、型変換をするものを見ていきます。 今回でやっと Collection 最後かな。 ただ、まだ List をやらんといかんのだが。 型変換は便利だけどあんまり面白くないんでサラッといっちゃいましょう。

List asList()
Collection asImmutable()
Collection asSynchronized()

Object asType(Class clazz)

List toList()
Set toSet()

as と to で似たのがありますが、as は自分自身を返すこともあるけど、to は既に指定された型のインスタンスであってもコピーを返す、という違いがあるようです。 これは Groovy 一般に言えるんかな?

メソッド 返り値 since 説明
asList()
asImmutable()
asSynchronized()
List
Collection
Collection
1.0
1.5.0
1.0
List に変換して返す。 既に List なら自分自身を返す
不変(変更できない)コレクションを返す
同期かされたコレクションを返す
asType(Class) Object 1.0 指定された型に変換する
toList()
toSet()
List
Set
1.0
1.8.0
List に変換して返す。 List に対して呼び出すとコピーを返す
Set に変換して返す。 Set に対して呼び出すとコピーを返す

ではそれぞれのメソッドのサンプルコードを。

asXxxx() メソッド

まずは as で始まるメソッド。 asList() は呼び出し元のコレクションを List オブジェクトに変換しますが、後で見る toList() と違って、既に呼び出し元が List なら自分自身を返します。 Groovy 一般について as は自分自身を返すのかな?と思いきや、asImmutable() とかはそうでもないみたいw asImmutable(), asSynchronized() は java.util.Collections クラスの unmodifiableList(), unmodifiableSet() を呼び出した場合と同じようです(unmodifiableCollectin() と言った方がいいのか)。

def langs = ['Java', 'Groovy', 'Scala', 'Clojure']
def langSet = langs as Set

// asList()
assert langs.asList() instanceof ArrayList
assert langs.asList() == langs
assert langs.asList().is(langs)    // 元のオブジェクト

// asImmutable()
assert langs.asImmutable().class.name == 'java.util.Collections$UnmodifiableRandomAccessList'
assert langs.asImmutable() == Collections.unmodifiableList(langs)    // List に対して
assert langSet.asImmutable() == Collections.unmodifiableSet(langSet)    // Set に対して

// asSynchronized()
assert langs.asSynchronized().class.name == 'java.util.Collections$SynchronizedRandomAccessList'
assert langs.asSynchronized() == Collections.synchronizedList(langs)    // List に対して
assert langSet.asSynchronized() == Collections.synchronizedSet(langSet)    // Set に対して

asType() メソッド

asType() メソッドは as キーワードを使って型変換するときに呼び出されます。 as で始まるので変換の必要がなければ自分自身が返されます。 知らないクラスが指定された場合は Collection をとるコンストラクタによってインスタンス生成される模様。

toXxxx() メソッド

最後は to で始まるメソッド。 toList(), toSet() メソッド。 toList() は asList() と異なり、呼び出し元が List オブジェクトでもそのコピーが返されます。

// toList()
assert langs.toList() instanceof ArrayList
assert langs.toList() == langs
assert !langs.toList().is(langs)    // 元と別のオブジェクト

// toSet()
assert langs.toSet() instanceof HashSet
assert langs.toSet() == langSet
assert !langs.toSet().is(langSet)    // 元と別のオブジェクト

さぁ、これで Collection に追加されたは終了。 でも、まだ List に追加されたメソッドが結構・・・

プログラミングGROOVY

プログラミングGROOVY