利用静态内部类为您的代码添加辅助功能 作者 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
还有一点十分有趣:静态内部类根据定义可以访问外部类的保护域和私有域。这件事可以说既有利也有弊。因为您可能在不经意间就破坏了外部类的保护域和私有域,从而违反了它的封装性,所以请小心对待!这一功能最恰当的应用就是编写类的 白盒测试程序--因为这样可以引入一些利用通常的黑盒测试很难引入的问题(黑盒测试不能访问对象的内部状态)。
结论通过使用静态内部类,您可以给您的系统添加辅助功能,以便完成诸如测试之类的工作,而对正式发布的产品不会带来任何不利影响。