- - PR -
フィールド変数を取得する
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-03-22 16:02
こんにちは
もともと String NAME[0] = "A"; String VALUE[0] = "1"; String NAME[1] … と定義されていたクラスからインターフェースを参照するように変更したのですが、 そのクラスに変数名を引数に渡せばその値を返すようにするのはどうしたらいいでしょうか? 引数にフィールド変数の名前を渡し、戻り値がその参照している値を返すmethod。 イメージ的には クラス名がTestとするとTestクラスに以下のようなメソッドがほしいです。 public String getVariable(String name) { return Test.name; } これでは当然できませんが、どうすればいいか分かりません。 よろしくお願いいたします。 | ||||
|
投稿日時: 2005-03-22 16:08
このテのことを実現するにはリフレクションと呼ばれる API 群を使います。
このスレッドが役に立つと思います。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19937&forum=12&3 実行時の方やメソッド名、プロパティ名などをコンパイル時に決定できないフレームワークなどでは必須の機能ですが、うまく使わないと予期せぬ実行時例外が頻発します。 ご要望のことは Map を使うだけで済むのかもしれませんのでまずは通常の(リフレクションを使わない)プログラミングで実現できないか検討することをお勧めします。 | ||||
|
投稿日時: 2005-03-22 16:42
さっそくのお返事ありがとうございました。
リフレクションに関しては知りませんでしたので フィールド変数にHashMapを定義して コンストラクタにmap.put()で値を格納することでとりあえずできました。 ただ、mapに何十個もキーとマッピングしているとなんか結構パフォーマンスに響いてくるかも知れないなと思いました。 どうもありがとうございました。 | ||||
|
投稿日時: 2005-03-22 16:59
そういうことは「ハッシング」について勉強してから言いましょうね。 | ||||
|
投稿日時: 2005-03-22 17:15
>ただ、mapに何十個もキーとマッピングしているとなんか結構パフォーマンスに響いてくるかも知れないな
>と思いました。 なるほど。でもリフレクションをつかっても結局インスタンスに福間られるプロパティのリストから情報をとってくるわけですから根本的な処理はかわらないですよね。 パフォーマンスについてはまず気にしないことです。パフォーマンスを低下させる絶対やってはいけないコーディング、みたいのはあるかもしれませんが、多くの場合はまず動くものを作ることが大事です。 遅いことに気が付いてからボトルネックを探してチューニングするほうが効率的です。 #もちろん、気になったら都度実験をして速度を確かめてみるのも良いですね | ||||
|
投稿日時: 2005-03-22 17:22
蛇足ですが・・・
リフレクションよりMapの方が参照に関わるコストが軽微になると思います。 Mapは通常、キーのインスタンスのハッシュ値を元に ハッシュ表から値のインスタンスを検索していますので、そんなに遅くはありません。 リフレクションはフィールドやメソッドを検索する為に 実装によって違いがありますが、バイトコードの解析が行われますので、 Mapよりはコストがかかってしまうでしょう。内部ではキャッシュされると思いますが。 で、試してみました。
環境によって違いますが、上記のソースをj2se1.4.2_06/Eclipse3.0.1で実行した場合、 リフレクションの方がMapより平均19倍時間がかかっていました。 | ||||
1
