2012-02-10 125 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和我不知道如果我失去了一些東西,但是這是完全可行,初始化方法只被調用一次只像一個靜態的初始化塊將是...