学会了这个技巧,您便可以把静态内部类的使用加入到您的 Java 使用技巧集锦当中。 静态内部类是在另一个类的定义中进行定义,并且标记为静态的类。我将向您展示一个实例,它利用静态内部类向另一个类中添加测试代码。
静态内部类在概念和实现上都十分简单,基本上来说就是在您的主类中定义一个静态类:
public class Foo
{
// ....
public static class Test
{
public static void main (String[] args)
{
// ....
}
}
}
说到向您主要的类中添加辅助代码,其中最重要的一点就是静态内部类被编译到一个单独的 .class 文件中,这个文件独立于它的外部类。例如,如果外部类叫做 Foo,而它的一个内部类叫 Test,那么这个内部类将被编译成 Foo$Test.class 文件。.class 文件的分离意味着您可以将辅助的嵌套代码与主要的外部类牢固地捆绑在一起。它们在同一个源文件中,内部类的确是在外部类的内部。您无需再付出任何发布或运行时的开销。真棒!例如,如果辅助代码只是用于调试,那么您只需发布 Foo.class 文件而将 Foo$Test.class 文件留下即可。
我将这个技巧主要用于编写外部类的演示代码、错误调试代码,以及进行单元测试实现类行为的自动验证。(当然,做为一个勤奋的开发人员,我准备将测试代码转化成单元测试。)
注意,要执行 Foo.Test 类的 main() 方法,请使用下面的命令:
% java Foo$Test
如果您正在使用的命令解释程序(shell)把“$”做为一个保留字,那么您应该使用下面的命令:
% java Foo\$Test
还有一点十分有趣:静态内部类根据定义可以访问外部类的保护域和私有域。这件事可以说既有利也有弊。因为您可能在不经意间就破坏了外部类的保护域和私有域,从而违反了它的封装性,所以请小心对待!这一功能最恰当的应用就是编写类的白盒测试程序--因为这样可以引入一些利用通常的黑盒测试很难引入的问题(黑盒测试不能访问对象的内部状态)。
XYPair 类十分简单。它提供一个固定的整数对,(x,y)。XYPair.Test 类有一个 main() 方法可以对 XYPair 进行简单的测试并输出结果。试着调整测试代码和核心代码来试验各种可能的问题。
如果您更加大胆,您可能想检验 Java 单元测试构架(JUnit)。您可以去掉源代码中的各种注释,然后利用 JUnit 的测试引擎运行这些测试程序。
结论
通过使用静态内部类,您可以给您的系统添加辅助功能,以便完成诸如测试之类的工作,而对正式发布的产品不会带来任何不利影响。