學(xué)會了這個技巧,您便可以把靜態(tài)內(nèi)部類的使用加入到您的 Java 使用技巧集錦當(dāng)中。靜態(tài)內(nèi)部類是在另一個類的定義中進行定義,并且標(biāo)記為靜態(tài)的類。我將向您展示一個實例,它利用靜態(tài)內(nèi)部類向另一個類中添加測試代碼。
靜態(tài)內(nèi)部類在概念和實現(xiàn)上都十分簡單,基本上來說就是在您的主類中定義一個靜態(tài)類:
public class TestDebug
{
private double num;
public TestDebug(double in)
{
num = in;
}
{
System.out.println(num);
}
public static class Test
{
public static void main(String[] args)
{
TestDebug td = new TestDebug(3.9);
td.output();
}
}
}
說到向您主要的類中添加輔助代碼,其中最重要的一點就是靜態(tài)內(nèi)部類被編譯到一個單獨的 .class 文件中,這個文件獨立于它的外部類。例如,如果外部類叫做 Foo,而它的一個內(nèi)部類叫 Test,那么這個內(nèi)部類將被編譯成 Foo$Test.class 文件。.class 文件的分離意味著您可以將輔助的嵌套代碼與主要的外部類牢固地捆綁在一起。它們在同一個源文件中,內(nèi)部類的確是在外部類的 內(nèi)部。您無需再付出任何發(fā)布或運行時的開銷。真棒!例如,如果輔助代碼只是用于調(diào)試,那么您只需發(fā)布 Foo.class 文件而將 Foo$Test.class 文件留下即可。
我將這個技巧主要用于編寫外部類的演示代碼、錯誤調(diào)試代碼,以及進行單元測試實現(xiàn)類行為的自動驗證。(當(dāng)然,做為一個勤奮的開發(fā)人員,我準(zhǔn)備將測試代碼轉(zhuǎn)化成單元測試。)
注意,要執(zhí)行 TestDebug.class 類的 main() 方法,請使用下面的命令:
% Java TestDebug$Test
如果您正在使用的命令解釋程序(shell)把“$”做為一個保留字,那么您應(yīng)該使用下面的命令:
% Java TestDebug\$Test
還有一點十分有趣:靜態(tài)內(nèi)部類根據(jù)定義可以訪問外部類的保護域和私有域。這件事可以說既有利也有弊。因為您可能在不經(jīng)意間就破壞了外部類的保護域和私有域,從而違反了它的封裝性,所以請小心對待!這一功能最恰當(dāng)?shù)膽?yīng)用就是編寫類的 白盒測試程序--因為這樣可以引入一些利用通常的黑盒測試很難引入的問題(黑盒測試不能訪問對象的內(nèi)部狀態(tài))。
結(jié)論通過使用靜態(tài)內(nèi)部類,您可以給您的系統(tǒng)添加輔助功能,以便完成諸如測試之類的工作,而對正式發(fā)布的產(chǎn)品不會帶來任何不利影響。