Generics
以前在看 Generics (泛型) 的時候, 並沒有什麼特別的感受,
當時只覺得(需要用到這東西的情境也太少了...), 孰不知, 不用則已, 一用讓我省下十幾個 java 的程式碼..
當時會用到 Generics 的關係, 是因為在處理 XMPP IQProvider, 當時案子有十幾個 IQProvider 需要實作, 然而每各 IQProvider 全都長的一樣, 只是在於最後產生的 instance class 不同, 後來我將這些東西結合泛形, 就成功減少了數十個 .java 檔案!
不過最大的考量依然是「情境」就是了, 這次是剛好很湊巧有這樣的情境讓我使用 Generics , 數年來第一次真正的要用到他, 不然平常還是不會用到這個阿阿阿阿 (多型可以解決我八成上的架構設計)
以下為瘦身過後的結果
public class STBIQProvider<I extends BaseIQInterface, D extends BaseIQDataInterface> extends IntrospectionProvider.IQIntrospectionProvider<I> {
private final Class<I> mBaseIQElementClass;
private final Class<D> mBaseIQDataClass;
public STBIQProvider(Class<I> elementClass, Class<D> data) {
super(elementClass);
mBaseIQElementClass = elementClass;
mBaseIQDataClass = data;
}
@Override
public I parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
SmackException {
D routeInfo = null;
String name;
outerloop: while (true) {
int eventType = parser.next();
switch (eventType) {
case XmlPullParser.START_TAG:
name = parser.getName();
switch (name) {
case "replynetinfo":
String text = parser.nextText();
JsonParser jsonParser = new JsonParser();
JsonObject jsonObject = (JsonObject) jsonParser.parse(XML.unescapeXml(text));
Gson gson = new Gson();
routeInfo = gson.fromJson(jsonObject, mBaseIQDataClass);
break;
}
break;
case XmlPullParser.END_TAG:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
}
}
I object = null;
try {
object = mBaseIQElementClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
object.setBaseIQData(routeInfo);
return object;
}
}