- PR -

変数の値に応じてgetterを呼びたい

投稿者投稿内容
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 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;
}

}
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-09-02 15:15
すぐ思いつくのは、こんなところでしょうか。

コード:

class UserInfo {

private Map store = new HashMap();

public void set( Object key, Object value ) {
store.put( key, value );
}

public void setName( String, name ) {
store.put( "name", name );
}

public void setOid( int oid ) {
store.put( "oid", new Integer( oid ) );
}

public Object get( Object key ) {
return store.get( key );
}

public String getName() {
return (String)get( "name" );
}

public int getOid() {
Object value = get( "oid" );
if ( value instanceof Integer ) {
return value.intValue();
} else {
return -1;
}
}
}



<追記>
下記でuk様がご指摘の「Mapで済ます」というのがこいつですね。
蛇足ですが、私、仕事ではWebアプリなんぞ作ってますが、
parameterやattributeばっかり使ってて、beansはいじったことないです。(- -;

[ メッセージ編集済み 編集者: Edosson 編集日時 2004-09-02 15:21 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-02 15:16
リフレクションを使うか、Jakarta CommonsプロジェクトのBeanUtilsを使えばできます。
http://jakarta.apache.org/commons/beanutils/

また、目的次第ですがわざわざBeanを作らずにMapで済ます、という手もあると思います。
ろっぷす
会議室デビュー日: 2004/07/27
投稿数: 8
投稿日時: 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);
}
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-09-02 17:22
いろいろと方法が出てるけど、私が上司なら、
「記述量を減らす目的でトリッキーなことをするな!」かな。

呼び出すメソッドを動的に決定することができないとか
まっとうな理由があるなら、リフレクションを使うけどさ。
「for ループのたびに…」とかいう理由では弱いね。
「がんばって書きなさい」という回答がいいと思うなあ。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-02 17:24
私なら、GOFデザインパターンから『コマンドパターン』が
使えないか検討します。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-09-02 17:34
引用:

私なら、GOFデザインパターンから『コマンドパターン』が使えないか検討します。


マジですか? この要件で コマンドパターンを検討するんですか?
デザパタ厨としか思えません…。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-09-02 17:59
引用:

「記述量を減らす目的でトリッキーなことをするな!」かな。


これは私も賛成です。

外的な理由で呼び出し先のメソッドが変わり、あらかじめメソッド名が予測できない
様な場合(例えば、メソッド名の一部が外部からの入力によって変わる、など)ならば、
リフレクションを使いますが。

でも、リフレクションは諸刃の剣ですよ。

スキルアップ/キャリアアップ(JOB@IT)