6

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

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

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

4

2 回答 2

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 编译器无论如何都会为您做很多事情。

于 2012-09-24T08:12:02.020 回答
1

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

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

于 2012-09-24T07:59:29.653 回答