こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

似たような名前のメソッドをまとめて定義したりforブロックの中から呼び出し、文字列を関数として評価

こんにちは。コードの記述についてですが、以下のような、
public void setKaisi1(int kaisi) {
String kaisijikan;
if (kaisi == 0) {
kaisijikan = "";
} else {
kaisijikan = koron(kaisi);
}
this.kaisi1 = kaisijikan;
}

public String getKaisi1() {
return this.kaisi1;
}

public void setSyuuryou1(int syuuryou) {
String syuuryoujikan;
if (syuuryou == 0) {
syuuryoujikan = "";
} else {
syuuryoujikan = koron(syuuryou);
}
this.syuuryou1 = syuuryoujikan;
}

public String getSyuuryou1() {
return this.syuuryou1;
}
このようなメソッド(setKaisi1()~setKaisi31()、setSyuuryou1()~setSyuuryou31()、getKaisi1()~getKaisi31()、getSyuuryou1()~getSyuuryou31())が長々と記述されているのですが、コンパクトに記述する方法などございましたらアドバイスお願いします。
また、このようなメソッドを呼び出す際も、for文で、順番にメソッドを呼び出して、例えば、
StringBuffer syuturyoku = new StringBuffer();
syuturyoku.append("<table id='zenhan' cellspacing='0' cellpadding='0'>");
//nissuuは月の日数です(28~31で、状況に応じて変わります)
for(int i=1; i<=nissuu; i++){
String Kmeirei="kekka.getKaisi"+Integer.toString(i)+"()";
syuturyoku.append("<tr><th><input type='text' class='jikan' value='"+Kmeirei+"' id='syuuryou"+ Integer.toString(i)+ "'/></th></tr>");
}……このような書き方ができればいいのですが、文字列で、"kekka.getKaisi"+Integer.toString(i)+"()"のような感じでつなげても、メソッドとして評価はされないので困っております。JavaScriptのevalのようなものがあればいいのですが、調べたところ、そういったものは無いようなので、こういった時はforループは使わず、地道にgetKaisi1()~getKaisi31()、getSyuuryou1()~getSyuuryou31()を呼び出すしかないのでしょうか?いい方法がございましたらアドバイスお願いします。

投稿日時 - 2008-07-01 14:24:00

QNo.4143117

困ってます

質問者が選んだベストアンサー

メソッドを直接名前で呼びたいならば
リフレクションという機能があります。
が、このケースの場合、#1 #2の方が言われているように
HashMapなどを使ったほうが良いような気がします。

こんな感じでどうですか?↓

public class Hoge {
 
 Map<Integer,String> kaishiMap = new HashMap<Integer,String>();
 Map<Integer,String> syuryouMap = new HashMap<Integer,String>();

 public void setKaisi(int index,int kaisi) {
  String kaisijikan;
  if (kaisi == 0) {
   kaisijikan = "";
  } else {
   kaisijikan = koron(kaisi);
  }
  kaishiMap.put(Integer.valueOf(index), kaisijikan);
 }

 public String getKaisi(int index) {
  return kaishiMap.get(Integer.valueOf(index));
 }

 public void setSyuuryou1(int index,int syuuryou) {
  String syuuryoujikan;
  if (syuuryou == 0) {
   syuuryoujikan = "";
  } else {
   syuuryoujikan = koron(syuuryou);
  }
  syuryouMap.put(Integer.valueOf(index), syuuryoujikan);
 }

 public String getSyuuryou1(int index) {
  return syuryouMap.get(Integer.valueOf(index));
 }

...

投稿日時 - 2008-07-01 16:38:51

お礼

アドバイスありがとうございます。非常に参考になりました。

投稿日時 - 2008-07-03 07:57:35

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

No1補足です。
evalの様なものは無い様ですし
ossuさんとの違いといえば
フィールドで日数を持って、関数で処理を分けるか
日数をキーで持って、オブジェクトで分けるかの違いです。
public class Kekka {
private String syuuryou;
public void setSyuuryou() {
//setSyuuryou処理実装
}
@Override //Java5.0未満ならこの行不要
public String toString() { return this.syuuryou; }
}

ListなりMapから取り出し
キーチェック後
syuturyoku.append("<tr><th><input type='text' class='jikan' value='"+ kekka +"' id='syuuryou"+ Integer.toString(i)+ "'/></th></tr>");

暗黙でtoString()が呼ばれると思います。
ご参考までに。。。

投稿日時 - 2008-07-01 16:21:09

お礼

アドバイスありがとうございます。非常に参考になりました。

投稿日時 - 2008-07-03 07:56:32

ANo.1

KekkaクラスでtoString()をオーバーライドして
各、値を持ったKekkaクラスをListかMapか何かに前者なら
intで日付インデックスを後者ならInteger(日付の数値)を
キーとして入れておいてcontainsKey()
だったけな?でキーを確認しながらkekka.toString()する

投稿日時 - 2008-07-01 15:58:48