- - PR -
変数の値に応じてgetterを呼びたい
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-09-02 14:54
変数の値に応じてgetterを呼びたい。
下記のように、name,old,addressの三つのフィールドがあります (それぞれ,setter,getterを持つ) そして、このフィールドの値に応じてgetterを呼びたいと考えております。 イメージとしては、 String value_ = uInfo.get$Foge(); となっていて、 get〜()の所を変数にして値を取り出したいと考えております。 つまり、forループを回る毎に String value_ = uInfo.getName(); String value_ = uInfo.getOld(); String value_ = uInfo.getAddress(); と変化するようにしたいです。 どなたかご存知でしたらご教授ください。 また、上記のような処理を他の方法でも行えるなら、 加えてアドバイスを下さいませ。 public class GetterTest { public static void main(String[] args) { UserInfo uInfo = new UserInfo(); uInfo.setName("taro"); uInfo.setOld("35"); uInfo.setAddress("tokyo"); String[] key_name = new String[3]; key_name[0] = "name"; key_name[1] = "old"; key_name[2] = "address"; for (int i = 0; i < key_name.length; i++) { String value_ = uInfo.getFoge(); } } } public class UserInfo { private String name; private String old; private String address; /** * @return */ public String getAddress() { return address; } /** * @return */ public String getName() { return name; } /** * @return */ public String getOld() { return old; } /** * @param string */ public void setAddress(String string) { address = string; } /** * @param string */ public void setName(String string) { name = string; } /** * @param string */ public void setOld(String string) { old = string; } } | ||||
|
投稿日時: 2004-09-02 15:15
すぐ思いつくのは、こんなところでしょうか。
<追記> 下記でuk様がご指摘の「Mapで済ます」というのがこいつですね。 蛇足ですが、私、仕事ではWebアプリなんぞ作ってますが、 parameterやattributeばっかり使ってて、beansはいじったことないです。(- -; [ メッセージ編集済み 編集者: Edosson 編集日時 2004-09-02 15:21 ] | ||||
|
投稿日時: 2004-09-02 15:16
リフレクションを使うか、Jakarta CommonsプロジェクトのBeanUtilsを使えばできます。
http://jakarta.apache.org/commons/beanutils/ また、目的次第ですがわざわざBeanを作らずにMapで済ます、という手もあると思います。 | ||||
|
投稿日時: 2004-09-02 17:13
ろっぷすと申します。
自分もbeansは使用した事がないですが。 メソッド名を変数で指定して呼出したいということであれば、 下記の方法で出来ると思います。 UserInfo uInfo = new UserInfo(); String[] key_name = new String[3]; key_name[0] = "Name"; key_name[1] = "Old"; key_name[2] = "Address"; Method method = null; for (int i = 0; i < key_name.length; i++) { String methodName = "get" + key_name[i]; method = uInfo.getClass().getMethod(methodName, null); String value = method.invoke(uInfo, null); } | ||||
|
投稿日時: 2004-09-02 17:22
いろいろと方法が出てるけど、私が上司なら、
「記述量を減らす目的でトリッキーなことをするな!」かな。 呼び出すメソッドを動的に決定することができないとか まっとうな理由があるなら、リフレクションを使うけどさ。 「for ループのたびに…」とかいう理由では弱いね。 「がんばって書きなさい」という回答がいいと思うなあ。 | ||||
|
投稿日時: 2004-09-02 17:24
私なら、GOFデザインパターンから『コマンドパターン』が
使えないか検討します。 | ||||
|
投稿日時: 2004-09-02 17:34
マジですか? この要件で コマンドパターンを検討するんですか? デザパタ厨としか思えません…。 | ||||
|
投稿日時: 2004-09-02 17:59
これは私も賛成です。 外的な理由で呼び出し先のメソッドが変わり、あらかじめメソッド名が予測できない 様な場合(例えば、メソッド名の一部が外部からの入力によって変わる、など)ならば、 リフレクションを使いますが。 でも、リフレクションは諸刃の剣ですよ。 | ||||
