内/匿名课程的最佳实践

匿名类和静态内部类的最佳实践(设计和性能)是什么?

我个人认为静态内部类提供了更好的封装,并且应该提供更好的性能,因为他们无法访问类外的最终变量。 但我从来没有真正质疑这一点。

我发现了一篇关于此的post,但我觉得它实际上并没有回答这个问题,只是人们对此的个人想法。

内部类(静态或非静态)与其封闭类的字段和方法具有完全相同的匿名类访问权限,静态内部类(实际上称为嵌套类)和(常规,非静态)内部类之间的区别在于静态一个需要显式引用封闭类的实例来访问某些东西。 当然,当你需要这样做时,它通常在创建内部类的封闭类的实例上,因此使用非静态内部类更容易和更清晰。

例子:

  • 内class(非静态)

    class A { private int field; private class B { public void doSomething() { field++; // Valid } } } 
  • 嵌套类(即“静态内部类”)

     class A { private int field; private static class B { public void doSomething(A a) { a.field++; // Valid } } } 
  • 匿名课

     class A { private int field; public void doSomething() { new Runnable() { @Override public void run() { field++; // Valid } } } } 

您是否使用该辅助function是另一个问题。 如果您访问封闭类的私有字段,则会生成一个访问者,因此它可能会影响性能,因为调用方法的成本与访问字段的成本不同,但在大多数情况下可能会忽略不计。 在进行不基于任何测量的微优化之前,您应该首先编写正确的代码(在设计和function方面)。 无论如何,JIT编译器为你做了很多事情。

查看Java源代码Collections和Pattern中的示例(它们位于JDK目录的src.zip中。在Eclipse中,您可以使用内联帮助读取代码

阅读本书Effective Java ,寻找内部类 ,了解staticinner和其他有用的interfaceenum和其他类的工作原理