回調(diào)函數(shù)是相當(dāng)有用,它的意義不僅可以讓調(diào)用者控制調(diào)用函數(shù)的執(zhí)行,還可以有效的將“算法”與“數(shù)據(jù)”分離,將涉及數(shù)據(jù)的部分放入回調(diào)接口(inner class)中,算法就會(huì)相對(duì)獨(dú)立。下面是一個(gè)示例。
先聲明一個(gè)回調(diào)接口,算法函數(shù)直接調(diào)用這些接口來(lái)獲取數(shù)據(jù):

/** *//**
* an inner callback interface for getting object data
*/

public interface ObjForJSON
{
String getName (Object o);
String getId (Object o);
void putJSONData (Object o, JSONObject js) throws JSONException;
}
算法函數(shù),根據(jù)對(duì)象數(shù)據(jù),進(jìn)行一些邏輯處理,將集合變成JSON格式的字串:

/** *//**
* iterator a set of objects, invoking its interfaces for format JSON set string
* @param setName set name in XML element
* @param iter set iterator object
* @param e XML element
* @param ctx context of DB
* @param obj an inner callback class for getting object data
*/

static public void setToJSON(String setName, Iterator iter, Element e, ManagerContext ctx, ObjForJSON obj)
{
Field2Attr f2a = ctx.getF2a();

String setStr = XmlHelper.getValue(e, setName, ctx);
logger.debug("before add {}", setStr);


try
{
// create JSON from exist string
JSONObject setJson;
if (setStr != null && setStr.length() > 0)
setJson = new JSONObject(setStr);
else
setJson = new JSONObject();


while (iter.hasNext())
{
Object o = iter.next();
// test if this object exists in array

if (!setJson.has(obj.getName(o)))
{
// if not exist, I'll add it to array
JSONObject jo = new JSONObject();
obj.putJSONData(o, jo);

setJson.put(obj.getName(o), jo);
logger.debug("add obj {}", obj.getId(o));
}
}

// set it to output element
XmlHelper.replaceValue(e, setName, setJson.toString(), ctx);

logger.debug("obj set is {}", setJson.toString());

} catch (JSONException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
用inner class回調(diào)類為參數(shù),調(diào)用算法函數(shù):

JSONHelper.setToJSON(f2a.HOST_SERVICES, o.getServices().iterator(), e, ctx, new ObjForJSON()
{

public String getId(Object obj)
{
return ((Service) obj).getId().toString();
}


public String getName(Object obj)
{
return ((Service) obj).getName();
}


public void putJSONData(Object obj, JSONObject js) throws JSONException
{
Service s = (Service) obj;
js.put("id", s.getId());
js.put("n", s.getName());
js.put("pid", o.getId());
js.put("p", o.getName());
}
});
上面的匿名inner class看似語(yǔ)法有點(diǎn)怪,實(shí)際上卻相當(dāng)簡(jiǎn)潔實(shí)用,你只要把它視作是實(shí)現(xiàn)了ObjForJSON接口的一個(gè)類就可以了,只不過(guò)它是內(nèi)部聲明的,沒(méi)有名字而矣。另外,最方便的是你可以在inner class里訪問(wèn)外層函數(shù)的本地變量,以及外層類的成員,大大方便數(shù)據(jù)處理。
上例中,由于使用回調(diào)inner class,可以針對(duì)多種對(duì)象執(zhí)行算法函數(shù),而不必要求待處理的對(duì)象去實(shí)現(xiàn)特定接口。更有些情況下,還必須使用回調(diào)才顯得合理。
posted on 2008-05-16 19:19
我愛(ài)佳娃 閱讀(2651)
評(píng)論(3) 編輯 收藏 所屬分類:
JAVA基礎(chǔ)