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