![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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のインスタンスを生成したときしか登録が実行されませんよね?宣言すると同時に、登録が実行されるような方法はありますでしょうか?
もっとスマートなデザインパターンがあるぞ、という話でも、お教えくだされば幸いです。
No.2ベストアンサー
- 回答日時:
#1です。
>一つ考えたのは,パッケージを組んで,パッケージの下に属するすべてのクラスを
リストアップするという方法なんですが・・・
そのように、限定をしていいのなら方法はあります。
私がよくやる方法で、プラグイン的な処理です。
概略は、
1.データ形式を表すクラスを、限定したディレクトリに入れておく。
[補足1]通常のクラスパスではないディレクトリにした方が、
扱いやすいし検索速度も上がるため。(経験上)
[補足2]ディレクトリには、クラスファイル単独ではなく、
パッケージを表すディレクトリ構造ごと格納すること。
2.そのディレクトリ階層から拡張子.classのファイルを対象として、
自作ClassLoaderでロードする。
[補足]通常のClassLoaderでは、クラスパスからしか読めないためカスタマイズ。
3.読んだClassオブジェクトが、DataTypeのサブクラスならリストへ追加。
[補足]「instanceof」で判断できる。
お礼が非常に遅くなってしまい、大変申し訳ありません。
結局、単に自動的に読み込めた方がきれい、というだけの問題でどうしても必要な機能ではなかったため、実装せずに一つ一つクラスを追加する方法で解決させてしまいました。せっかくの回答を生かせずに申し訳ありません。
ただ、結果的に方法がある、と分かっただけでも幸いです。やはり、自作クラスローダを使わないと無理だったのですね....技術的にはいろんなところで使えそうです。勉強になりました。覚えておこうと思います。
回答ありがとうございました。
No.1
- 回答日時:
やっぱり、ManagerOfDataTypeのコンストラクタで必要な登録をするコードを書くか、
定義ファイルなどを用意しておいて、それを読むしかないのでは?
何の指示もせず、ManagerOfDataTypeのインスタンスを生成しただけでリストを作るのは無理があると思いますけど。
DataTypeを継承したクラスがどこにあるか分からないし、
本当にリストに追加していいのかも判断できない。
回答ありがとうございます。
>DataTypeを継承したクラスがどこにあるか分からないし、
本当にリストに追加していいのかも判断できない。
とりあえず、派生クラス名さえ集められれば、java.lang.ClassのgetSuperclassを使って、DataType型から派生しているかどうかは分かるんですが。内部クラスやメンバクラスをリストする関数はあるのに、派生クラスをリストする関数はないんです。
やはり無理なんでしょうかねぇ。一つ考えたのは,パッケージを組んで,パッケージの下に属するすべてのクラスをリストアップするという方法なんですが・・・これも、同じように、クラス名が分かっているときに、その所属がどのパッケージかを示す関数はあるんですが、逆の方法がわかりません。
ManagerOfDataTypeは、別にstaticでもいいんですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Java java final 1 2022/06/10 22:49
- Excel(エクセル) Excelの帳票形式をアクセスに取り込むため、 csvのデータ形式になるように、マクロを作成している 2 2022/06/12 22:52
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- XML エクセルのマクロについて教えてください。 3 2023/02/06 09:06
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java eclipse 型に解決できません
-
UMLのクラス図はmain()も含むん...
-
main()を持つクラスが2つ以上...
-
クラスTシャツの背ネーム 面白...
-
グローバルIPとプライベートIP...
-
「天声人語」をインターネット...
-
VBソースからクラス仕様書作成
-
エクセルのデータ振り分け方法...
-
ASP.netについて
-
Eclipseでのクラス作成について
-
VB.NETでCreateProcess
-
クラスにアクセスできません。
-
packageとimport の違いって?
-
Java「デフォルトのパッケージ...
-
複数のクラスで共通した関数を...
-
EclipseでJSPのコンパイルエラー
-
共通で使う関数を集めたクラス...
-
A・B・Cクラスとは?
-
IPアドレスのクラスAを取得して...
-
クラスの継承でメンバ変数が・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の重複する値とその個数を...
-
「天声人語」をインターネット...
-
java eclipse 型に解決できません
-
グローバルIPとプライベートIP...
-
ポータブル電源を買おうと思う...
-
容姿について
-
自作のクラスファイルがインポ...
-
どこからも呼ばれていない無意...
-
UMLのクラス図はmain()も含むん...
-
同一パッケージにあるクラスが...
-
main()を持つクラスが2つ以上...
-
1 つのヘッダファイルに複数の...
-
アルキメデスの大戦の櫂はなぜ2...
-
dllと同じプロジェクトにする方法
-
IPアドレスの3バイト目の呼び方
-
3年間同じクラスになる確率
-
重複エラーを解決するには
-
同じパッケージ、クラス名が含...
-
コンボボックスのマウスホイー...
-
同じクラスにならない確率を教...
おすすめ情報