2012-09-24 83 views
6

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

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

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

+0

没有想过在这方面的表现。但设计:设计遵循功能。我想有些情景是静态内部是“最佳实践”,而其他人是匿名者。 – Fildor

+0

性能可能会忽略不计......但我对它有点好奇。 – David

回答

4

内部类(静态或没有)正是其封闭类的领域和方法,匿名类相同的访问中,静态内部类之间的区别(行为ually调用嵌套类)和(常规,非静态)内部类是静态的需要显式引用封闭类的实例来访问某些东西。当然,当你需要这样做时,它通常在创建内部类的封闭类的实例上,所以使用非静态内部类更容易和更清晰。

实例:

  • 内部类(非静态)

    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:...先写正确的代码... – Jayan

+0

没有静态内部类,因为它们无权访问父类成员(即非静态成员将无法从静态上下文访问)。我们称这些是静态嵌套类,像顶级或独立类一样工作。 –

+0

@LeninkumarKoppoju事实上,他们被称为嵌套类,后来我学到了正确的名字。我会更新答案。然而,嵌套类可以访问封闭类的任何成员,如果它具有对该类的一个实例的引用:'outer.privateInt = 42;'作品,这对另一个顶级类是不可能的。 –

1

有Java源代码的集合和模式有样品(他们是在JDK目录下的src.zip的样子。在Eclipse中,你可以阅读内嵌帮助

代码读一本书Effective Java,看对于内部类了解如何工作staticinner和其他有用的interfaceenum和其它类

+0

@ cl-r:它看起来像原始链接违反了版权。我用amazone链接替换它 – Jayan

+0

@Jayan,谢谢,我不知道这个问题。 –

+0

很久以前,我看到这本书...想想我会重温它:) – David