「インスタンス生成の部分のコードでは結局ifやswitchがあるじゃん」っていうお悩みに対して、どう考えればよいのだろう?
これは、「if 文を書かないでも条件分岐できる」ということを知ると、視野が広がります。
例えば、
private Map<Integer,Class<? extends AbstractDataReader>> readerMap; { readerMap = new HashMap<Integer, Class<? extends AbstractDataReader>>(); readerMap.put(CSV, CSVDataReader.class); readerMap.put(XML, XMLDataReader.class); } AbstractDataReader create (int formartId) throws Exception{ return readerMap.get(formartId).newInstance(); }
のようにすると、if 文を書かないでも条件分岐できます。*1Strutsがstruts-configを読み込んでやっていることもこれに近い。
DIの考え方に近づくとこういう風に「取りに行く」よりも「外から入れる」ことを好むようになりますが、それは次の段階の話。
*1: genericsがいけてませんが...