2012-02-10 150 views
8

如何允许静态初始化在这样一个内部类:内部类的静态初始化器?

public class MyClass { 

    public class InnerClass { 
     static { 
      // do something 
     } 
     public bar(){ 
      // do something 
     } 
    } 

    // method stuff 
    public void foo() { 
     // do something 
    } 

} 

回答

10

JLS 8.1.3 Inner Classes and Enclosing Instances

内部类可以不声明静态初始化(§8.7)或部件接口。

你可能想要的是一个嵌套类:

public static class InnerClass { // note "static" 
+1

以我的经验,在大约80%的时间里,嵌套类是人们想要定义的。在这种情况下,关键字的最小数目会伤害Java;作为语言设计师,您可能希望将嵌套类设为默认类,并为内部类提供“内部”关键字。 – 2012-02-10 09:31:22

4

您需要定义InnerClass类为静态。但是,此后,它不会是一个普通的内部阶级。

+0

这对我来说可以,因为我的“内部”类根本不会访问封闭的类方法。实际上,我可以创建一个单独的.java类文件,但是因为只能在所述封闭类上访问该类,所以我决定只附加这个类。 – xybrek 2012-02-10 11:53:21

1

由于已经声明了@yshavit,你不能声明静态初始化器,但是从我发现的你可以通过声明一个方法来完成你想要的任何初始化并在定义你的类的字段时调用它。例如,我实现了这个迭代器(这是一个匿名内部类):

public Iterator<String> iterator() { 

    return new Iterator<String>() { 

     int someField = initializeIterator(); 

     // Keeps current position in the list of direct neighboring out 

     private int initializeIterator() { 
      // Do your initializations 
     } 

     @Override 
     public boolean hasNext() { 
      //hasNext implementation 
     } 

     @Override 
     public Vertex next() { 
      //next implementation 
     } 
     //... 

这种感觉非常破解-Y和我不知道如果我失去了一些东西,但是这是完全可行,初始化方法只被调用一次只像一个静态的初始化块将是...