電子書籍の厳選無料作品が豊富!

Stringであらわせる独自のデータ形式がいくつかあり、次のようにして、

abstract class DataType{
//このファイル形式かどうかを判定する
abstract boolean isThisDataType(String s);
}
class DataTypeA extends DataType{
boolean isThisDataType(String s){...}
}
class DataTypeB extends DataType{
boolean isThisDataType(String s){...}
}
class ManagerOfDataType{
DataType[] getAllSupportedDataTypes(){...} //サポートしているすべてのデータ形式を取得


DataType FindBestDataType(String s){
for(i=0;i<getAllSupportedDateTypes().length();i++){
if(getAllSupportedDataTypes()[i].isThisDataType(s)){
return getAllSupportedDataTypes()[i];
}
}
}
}

のようにして、どのデータ形式でも対応できるようにしたいと思っているのですが、わからないのは、「サポートしているすべてのデータ形式を取得」、すなわち、DataTypeの派生クラスをすべて取得するところです。

DataTypeA,BのコンストラクタでstaticなListに自分のクラス名を登録していくなどの方法も思いついたのですが、それでは、DataTypeA,Bのインスタンスを生成したときしか登録が実行されませんよね?宣言すると同時に、登録が実行されるような方法はありますでしょうか?

もっとスマートなデザインパターンがあるぞ、という話でも、お教えくだされば幸いです。

A 回答 (2件)

#1です。



>一つ考えたのは,パッケージを組んで,パッケージの下に属するすべてのクラスを
リストアップするという方法なんですが・・・

そのように、限定をしていいのなら方法はあります。
私がよくやる方法で、プラグイン的な処理です。

概略は、

1.データ形式を表すクラスを、限定したディレクトリに入れておく。

 [補足1]通常のクラスパスではないディレクトリにした方が、
   扱いやすいし検索速度も上がるため。(経験上)

 [補足2]ディレクトリには、クラスファイル単独ではなく、
   パッケージを表すディレクトリ構造ごと格納すること。



2.そのディレクトリ階層から拡張子.classのファイルを対象として、
  自作ClassLoaderでロードする。

 [補足]通常のClassLoaderでは、クラスパスからしか読めないためカスタマイズ。


3.読んだClassオブジェクトが、DataTypeのサブクラスならリストへ追加。

  [補足]「instanceof」で判断できる。
    • good
    • 0
この回答へのお礼

お礼が非常に遅くなってしまい、大変申し訳ありません。

結局、単に自動的に読み込めた方がきれい、というだけの問題でどうしても必要な機能ではなかったため、実装せずに一つ一つクラスを追加する方法で解決させてしまいました。せっかくの回答を生かせずに申し訳ありません。
ただ、結果的に方法がある、と分かっただけでも幸いです。やはり、自作クラスローダを使わないと無理だったのですね....技術的にはいろんなところで使えそうです。勉強になりました。覚えておこうと思います。

回答ありがとうございました。

お礼日時:2004/10/23 07:19

やっぱり、ManagerOfDataTypeのコンストラクタで必要な登録をするコードを書くか、


定義ファイルなどを用意しておいて、それを読むしかないのでは?

何の指示もせず、ManagerOfDataTypeのインスタンスを生成しただけでリストを作るのは無理があると思いますけど。

DataTypeを継承したクラスがどこにあるか分からないし、
本当にリストに追加していいのかも判断できない。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>DataTypeを継承したクラスがどこにあるか分からないし、
本当にリストに追加していいのかも判断できない。

とりあえず、派生クラス名さえ集められれば、java.lang.ClassのgetSuperclassを使って、DataType型から派生しているかどうかは分かるんですが。内部クラスやメンバクラスをリストする関数はあるのに、派生クラスをリストする関数はないんです。
やはり無理なんでしょうかねぇ。一つ考えたのは,パッケージを組んで,パッケージの下に属するすべてのクラスをリストアップするという方法なんですが・・・これも、同じように、クラス名が分かっているときに、その所属がどのパッケージかを示す関数はあるんですが、逆の方法がわかりません。
ManagerOfDataTypeは、別にstaticでもいいんですが・・・

お礼日時:2004/09/30 17:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!