天天看點

匿名内部類的參數引用隻能是final,可能遇到的問題及其解決

這個是我碰到比較多次的問題,一開始是不解,不過查了下大家都覺得沒什麼,而且隻是加個final好像影響也不大,于是我就直接加個final了事,之後也不管了

直到昨天:

遇到了這個宿命般的問題

匿名内部類的參數引用隻能是final,可能遇到的問題及其解決

難道解決方法是把它換成引用類型?

我去,居然不行,包裝類不能改變值,尼瑪,怎麼會這麼巧

嘿,媽的,那就自己來!自己定義一個類型!

是以這樣直接改成final果然是會遇到問題的,比如我希望它變的時候,最簡單的情況就是一個for循環的i++

于是我很自然去檢視了final的特性,發現有個可以利用的漏洞,那就是對于引用類型final隻是限定了它棧中的位址不能改,而堆中的值可以随便改

于是我馬上想到了int的包裝類,為此我特地好好看了下Intger,結果發現它沒有隻改變值的API!

短暫的挫折過後,我立刻想到了,那還不簡單,自己定義一個類型就好了,比如這樣:

匿名内部類的參數引用隻能是final,可能遇到的問題及其解決

自己定義了一個簡單的類型:

匿名内部類的參數引用隻能是final,可能遇到的問題及其解決

本來以為這個事情就這麼完美結束了,直到我今天查其他資料的時候,看到有人用了這麼一個非常機智的技巧:

匿名内部類的參數引用隻能是final,可能遇到的問題及其解決

這才真是完美!是以有時候還是需要一點機智

具體為什麼要這樣好像比較複雜,暫時跳過:

https://www.zhihu.com/question/21395848