- ベストアンサー
似たような名前のメソッドをまとめて定義したり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()を呼び出すしかないのでしょうか?いい方法がございましたらアドバイスお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
メソッドを直接名前で呼びたいならば リフレクションという機能があります。 が、このケースの場合、#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)); } ...
その他の回答 (2)
- public_sa
- ベストアンサー率52% (13/25)
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()が呼ばれると思います。 ご参考までに。。。
お礼
アドバイスありがとうございます。非常に参考になりました。
- public_sa
- ベストアンサー率52% (13/25)
KekkaクラスでtoString()をオーバーライドして 各、値を持ったKekkaクラスをListかMapか何かに前者なら intで日付インデックスを後者ならInteger(日付の数値)を キーとして入れておいてcontainsKey() だったけな?でキーを確認しながらkekka.toString()する
お礼
アドバイスありがとうございます。非常に参考になりました。