Effective Javaを読むチャレンジ-項目29その1-

項目29 型安全な異種コンテナーを検討する

異種コンテナーって何でしょうね。いや、そもそもコンテナーなんてJavaずっとやってきて初めて聞く言い回しですよ・・・と最初は思ったのですが、実は似たような表現を耳にしたことがある人は多いかもしれません。

Javaの入門書を見ると、Javaの変数はデータを格納する入れ物だってよく書いてあります。入れ物、つまり英語にするとコンテナーです。この項目では変数という意味ではなく、データを複数保持するためのオブジェクト(リストのようなもの)という意味でコンテナーという表現を使っているように見えます。コンテナーという言葉の本来の意味を考えれば、こちらの方が自然ですよね。最初に「変数=箱」って言い始めたの誰なんでしょう・・・。

本書ではコンテナー(データを保持するためのオブジェクト)の例として、SetやMapといったコレクション、ThreadLocal(スレッドローカル変数)やAtomicReference(アトミック参照)などを挙げています。また、これらは単一要素コンテナーだと言っています。

単一要素コンテナーに対して、これらの使用すべてにおいては、それはパラメータ化されたコンテナー

単一要素コンテナーを使用するときはパラメータ化しているということですね、「Set<String>」といった形です。単一要素コンテナーSetに対して、要素型Stringを表す型パラメータ<String>を持っているとも言えます。

このようにSet<E>は1つの型パラメータEを持っているし、Map<K,V>はキーKと値Vの2つの型パラメータを持っています。Kはすべて同じ型であり、Vも同じ型なので、単一要素コンテナーとなります。

コンテナーの代わりにキーをパラメータ化し、値を出し入れするためにコンテナーに対してパラメータ化されたキーを渡す

このあと、データベースの行は型安全な方法でそれらすべての列をアクセスできる方がよいです、などと急に話が変わり、コンテナー云々の話はいったん置き去りにされます。謎を抱えたまま、とりあえず先を読みます。

ここでデータベースの行に型安全にアクセスするとはどういう意味でしょうか。データベースの行は、文字列型や整数型、日付型やバイナリ型など様々な型を持っています。例えば文字列型の列へデータを格納しようとするとき、そのデータは本当に文字列型でしょうか。また、整数型の列に文字列型のデータを格納しようとしてないでしょうか。そういった場合に格納するデータの型を調べるためにジェネリックスが使えるというのです。

そのジェネリックスの使用方法を簡潔にまとめたのが見出しの「コンテナーの代わりにキーをパラメータ化し、値を出し入れするためにコンテナーに対してパラメータ化されたキーを渡す」という言葉となります。

その具体的な方法は次回とします。さすがジェネリックス最後の項目、なかなか進めませんね・・・。


2016/04/21追記

どうも型安全な異種コンテナーについて全然わかっていなかったようでして・・・勉強し直します。

広告
  • LINEで送る