ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのGenericとInterfaceの組合せ

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ご存知の方いらっしゃれば、ぜひとも考え方などご教示お願いいたします。

やりたい事は以下のものです。
1.Genericでクラスを定義する
2.指定される型にはInterfaceが代入される
3.2で生成されたクラス内で、Interfaceの実装クラスを取得したい

条件として、Aa.class → IAa.class のみと単独です。
極端に言うと、getClass.getname()でクラス名を取得し、文字列操作を行って実装クラスにする、という方法と同じことをロジックで行いたいと考えております(文字列操作もロジック…ですね)

現在はGenericクラスにフィールドとして Class<?> type を宣言しておき、Genericクラス生成後にSetterで代入、メソッド内でその代入変数を参照させる、という方法を採用しておりますが、それだとせっかくGenericとしているのに手がかかるのでありがたみが半減、と感じております。
【現在の対処】
Generic<InterfaceClass, PKClass> clazz = new Generic<InterfaceClass, PKClass>(); ←実際はここの部分はSpringで管理
clazz.setImplClazz(XxImpl.class);

なにかしらの方法でGeneric内で実装クラスを取得する方法は無いものでしょうか?

クラスとインターフェースをXMLで管理する、は余計な管理(とバグ)が発生するのでやりたくありません。3つ目の引数をImplクラス…というのもなんか違う気がして(本音は引数を増やすと既存のソースの修正が大変デス… あ、これはどのみち発生する作業か?)
皆さま方のプロジェクトではどのように対応しているのでしょうか?

よろしくお願いいたします。

コメント(3)

すみません、追記です。
Generic<InterfaceClass, PKClass> clazz;
と引数が二つな理由はHibernateを利用したGenericDaoだからです。
(なので引数が3つというのが(個人的に)違和感があるのです)
JavaのGenericは、実行時に型情報を取得できないので、実行時型に依存したことをするのがつらいですね。
Genericクラスの型引数にAがあったとしてもA.Classは取得できませんし、instanceofによるチェックもできません。
つまり、3つ目の型引数を追加しても、多分問題は解決しません。

実装クラスが一つしかないのであれば、リフレクションを使って実装クラスを取得することもできますが、実装クラスが一つであることが分かっているなら、そもそも実行時の型を取得する必要がありませんし。
>seraphさま
レスありがとうございます。
そうなんですよね、実行時に型がわからないのがつらいです。

とりあえずはSpring管理なので
clazz.setImplClazz(XxImpl.class);
の部分を削除し、SpringのSetterメソッドで(実装クラスを)インジェクションさせました。(つまりXMLに実装クラスを記述しました)
ちなみになぜ実装クラスが欲しかったかというとHibernateのTransformers.aliasToBeanメソッドが実装クラスじゃないとだめだったからです。
クラスとインターフェースは1:1なのですが、クラス数が100以上なのでどうしてもGenericのクラスで吸収させたくて。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。