内/匿名课程的最佳实践

时间:2012-09-24 07:49:18

标签: java inner-classes anonymous-class

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

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

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

2 个答案:

答案 0 :(得分:4)

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

示例:

  • 内部类(非静态)

    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
                }
            }
        }
    }
    

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

答案 1 :(得分:1)

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

阅读一本书Effective Java,寻找内部课程以了解如何运作staticinner和其他有用的interface,{{1和其他类