【IT168 技術(shù)文檔】在Java中,匿名類(Anonymous inner classes)多用來處理事件(event handle)。但其實(shí),它們對(duì)于debug也很有幫助。本文將介紹如何利用匿名類來簡化你的debug。
我們?cè)撊绾握{(diào)試那些非自己源碼的方法調(diào)用呢?比方說,對(duì)Jbutton.setEnable()的調(diào)用。Java提供的匿名類,可以很好的解決這個(gè)問題。
通常,當(dāng)我們繼承一個(gè)類時(shí),我們可以通過提供新的方法來覆蓋(override)該類中現(xiàn)有的方法:
public class MyButton extends JButton
{
public void setVisible( boolean visible )
{
// Rolling our own visibility
}
}
在實(shí)例化(instantiate)MyButton類之后,任何對(duì)方法setVisible()的調(diào)用,都會(huì)調(diào)用上面代碼中的setVisible()方法。可問題是,我們不想僅僅為了覆蓋一個(gè)方法而繼承整個(gè)類,尤其是所需的實(shí)例(instantiation)很有限的時(shí)候。匿名類使得我們能在實(shí)例化的同時(shí)覆蓋方法。
如果我們只想在某個(gè)JButton對(duì)象中加入我們自己的可視邏輯,那么我們可以在申明這個(gè)button對(duì)象的同時(shí)重寫這個(gè)方法:
JButton myButton = new JButton()
{
public void setVisible( boolean visible )
{
// Rolling our own visibility
}
};
這段代碼都做了什么?花括號(hào)({})中間的代碼申明了setVisible()方法,并覆蓋了JButton類中的那個(gè),但這僅限于myButton對(duì)象。我們沒有改變JButton類,也沒有申明一個(gè)新類,我們僅給了一個(gè)特殊的JButton對(duì)象它自己的可視邏輯。
在面向?qū)ο笮g(shù)語中,myButton是一個(gè)從JButton類繼承而來的無名,也就是匿名,類的對(duì)象。
這種創(chuàng)建匿名類并同時(shí)覆蓋方法的技術(shù)用在什么時(shí)候?假設(shè)你在編寫一段Swing程序,在你向一個(gè)GUI物件(element)中添加一個(gè)event listener(假設(shè)叫作ActionListener)之前,你已經(jīng)編寫了一段這種機(jī)制的代碼。現(xiàn)在,我們假設(shè)我們有個(gè)龐大的類,里面有很多按鈕,但是有一個(gè)按鈕時(shí)隱時(shí)現(xiàn),你想知道為什么會(huì)出這樣的異常情況,利用上面的代碼并在setVisible()方法上設(shè)置斷點(diǎn)。然后,當(dāng)你運(yùn)行你的程序時(shí),你設(shè)置的斷點(diǎn)就會(huì)在恰當(dāng)?shù)牡胤綍和3绦颉z查棧軌跡(stack trace),我們會(huì)發(fā)現(xiàn)沒有按所預(yù)期的那樣來調(diào)用setVisible()方法的原因并修復(fù)這個(gè)它。
匿名類在debug類似這種源碼不可得的類的時(shí)候很有用。即便在源碼可得的情況下,在大量使用的方法(如setVisible)上設(shè)置斷點(diǎn),也是件很麻煩的事情,因?yàn)槲覀冊(cè)诿總€(gè)實(shí)現(xiàn)了setVisible()方法的類的對(duì)象上都要轉(zhuǎn)入斷點(diǎn)。而匿名類可針對(duì)某個(gè)特定的對(duì)象進(jìn)行“外科手術(shù)”式的debug。