1. 程式人生 > >Java匿名內部類的傳值

Java匿名內部類的傳值

在Nutz中,存在大量需要使用匿名內部類的情況,很多童鞋都對傳值很困惑,所以我這裡說明一下

傳入:

//匿名內部類,只能訪問final的本地變數及方法引數publicvoid addUser(finalString name,String passwd,finalString userType){User user =null;if("admin".equal(userType))
        user =newAdminUser(name, passwd);//僅作演示.else
        user =newUser(name, passwd);finalUser _user = user
;//因為user變數不能設定為final,所以需要新加一個變數來中轉Trans.run(newAtom(){publicvoid run(){ dao.insert(_user);if(log.isDebugEnable()) log.debugf("Add user id=%d, name=%s , type=%s", _user.getId(), name, userType);}});}

傳出(獲取方法返回值等等):

方法1 – 物件陣列法通過一個final的Object物件陣列,存放需要的值

publiclong countUser
(finalString userType){finalObject[] objs =newObject[1];Trans.run(newAtom(){publicvoid run(){ objs[0]= dao.count(User.class,Cnd.where('userType','=', userType));}});return((Number)objs[0]).longValue();}

方法2 – ThreadLocal法通過一個ThreadLocal來存放結果,這個ThreadLocal可以是靜態的,供全app使用的

privatestaticfinalThreadLocal
re =newThreadLocal();//自行補上泛型Objectpubliclong countUser(finalString userType){Trans.run(newAtom(){publicvoid run(){ re.set(dao.count(User.class,Cnd.where('userType','=', userType)));}});return((Number)re.get()).longValue();//嚴謹一點的話,應該將ThreadLocal置空}

方法3 – Molecule法Molecule類是Nutz內建的抽象類類,實現Runnable和Atom介面,添加了兩個獲取/設定值的方法.

publiclong countUser(finalString userType){Molecule mole =newMolecule(){//需要自行補齊泛型publicvoid run(){
            setObj(dao.count(User.class,Cnd.where('userType','=', userType)));}};Trans.run(mole);return((Number)mole.getObj()).longValue();}