オブジェクト指向の多様性の出番ではないでしょうか。とりあえず、以下のようにすれば switch はなくなります。(まったく検証してないのでコンパイルも通らないと思いますが雰囲気だけ)
それで、 A x = new A(1); と呼ぶかわりに A x = new A1(); とコンストラクトし、 x.getName() と呼ぶと x に多様性が出ます。
もし、サンプルコードの状況で終わりであれば、継承はコードが増えますが、複雑になってくれば、それほどは増えないはずです。通常は、共通コードがあり、それが階層化します。たとえば、一部のクラス間で共通のコードがあれば、それらをサブクラスでまとめてそのサブクラスに共通コードを書くことで、複雑な分岐を避けることができます。メソッドのオーバライドで分岐することで if 文と switch 文を減らすことで可読性を向上させることができます。
ruby だと、上記のような連想配列の初期化宣言が簡単にできるのですが、
java では型宣言や 連想配列の初期化がちょっと面倒です。
でもひとまず java で書いてみました。
java に慣れた方ならもっとよい 書き方ができと思います。
クラス A に toString() を定義して、生成したインスタンスに内容を確認できるようにしています。
ここで、 new B(...) したものを連想配列には入れていません。
A を new する度に、B を new してそれを a のインスタンスに与えないといけないからです。
java
1packageteratail;23importjava.util.HashMap;4importjava.util.Map;56classPair{7publicint v;8publicString s;9Pair(int v,String s){10this.v = v;11this.s = s;12}13}1415classB{16publicint val;17publicString name;18B(int val,String name){19this.val = val;20this.name = name;21}22}2324publicclassA{25privateint id;26privateString name;27privateint hoge;28privateB b[];2930finalstaticMap<Integer,Object[]> PARAMS;31static{32finalPair PARAMS_0[]={33newPair(0,"0"),34newPair(1,"1"),35newPair(2,"2")36};37finalPair PARAMS_B[][]={38{newPair(0,"name"),newPair(2,"name")},39{newPair(3,"name"),newPair(0,"name"),newPair(2,"name")},40{newPair(2,"0")}41};4243 PARAMS =newHashMap<>();44Object[] pair0 ={PARAMS_0[0], PARAMS_B[0]};45 PARAMS.put(0, pair0);46Object[] pair1 ={PARAMS_0[1], PARAMS_B[1]};47 PARAMS.put(1, pair1);48Object[] pair2 ={PARAMS_0[2], PARAMS_B[2]};49 PARAMS.put(2, pair2);50}5152A(int id){53this.id = id;54decideField(id);55}56publicStringtoString(){57String ans ="id:"+ id;58 ans +=", name:"+ name +", hoge:"+ hoge;59 ans +=" B[";60for(B x : b){61 ans +="("+ x.val +", "+ x.name +") ";62}63 ans +="]";64return ans;65}6667privatevoiddecideField(int id){68Object[] ps = PARAMS.get(id);69Pair params_0 =(Pair)(ps[0]);70Pair[] params_b =(Pair[])(ps[1]);7172this.name = params_0.s;73this.hoge = params_0.v;7475int len = params_b.length;76this.b =newB[params_b.length];77for(int i =0; i < len; i++){78Pair p = params_b[i];79this.b[i]=newB(p.v, p.s);80}81}8283publicstaticvoidmain(String[] args){84System.out.println(newA(0));85System.out.println(newA(1));86System.out.println(newA(2));87}88}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/14 00:40
2018/09/14 01:02
2018/09/14 01:31