2009-02-11 151 views
5

訪問外部匿名類的領域從內部B類訪問外部類A的域x,我知道你可以使用「A.this.x」。但如果外部類也是匿名的呢?例如,從內部匿名類

public class Main1 { 
    public static void main(String[] args) { 
     Comparable c1 = new Comparable(){ 
      int x = 3; 
      public int compareTo(Object o) { 
       Comparable c2 = new Comparable(){ 
        int x = 4; 
        public int compareTo(Object o) { 
         return x; // <-- THIS LINE 
        } 
       }; 
       return c2.compareTo(o); 
      } 
     }; 
     System.out.println(c1.compareTo(null)); 
    } 
} 

當運行該代碼,被印刷的4值,因爲這是C2的字段x的值。但是,我想更改標記爲「THIS LINE」的行,以便它返回外部類的x(即c1的字段x,值爲3)。如果外部類(即C1的類)是一個名爲A級,那麼我可以代替

return x; 

return A.this.x; 

但由於外部類也是匿名的,我沒有一個使用的名字。

問:是否有修改標註「本線」行,以便它指的是C1的域x,而不是C2的,在不改變匿名類到名爲類的方法嗎?

我意識到這段代碼真的很醜,並且這種方式使用匿名類的編程風格不是很好,但代碼是由另一個程序生成的,而這是實現生成器的最簡單方法。

回答

4

我會避免通過選擇X以外的名稱隱藏另一個變量。

0

我相信你將不得不宣佈字段最後 - 你在那裏的代碼編譯只是因爲你抱怨的陰影 。不對。

這看起來像一個典型的情況下像Lisp的gensym會使事情變得更容易。換句話說,讓代碼生成器爲這些變量使用不同的標識符 - 例如x1和x2。

+0

該字段不需要是最終的;這隻適用於參數/局部變量。如果他稱外場爲'y',他可以從最內層的階層進入。 – 2009-02-11 15:07:51

2

簡單的答案是沒有影子的變量:

public static void main(String[] args) { 
    Comparable c1 = new Comparable() { 
     int x = 3; 
     public int compareTo(Object o) { 
      Comparable c2 = new Comparable() { 
       //changed this name 
       int y = 4; 
       public int compareTo(Object o) { 
        return x; 
       } 
      }; 
      return c2.compareTo(o); 
     } 
    }; 
    System.out.println(c1.compareTo(null)); 
} 

輸出:

既然你與生成的代碼的工作,這是一個選項您?

1

AFAIK有沒有辦法達到你想要的東西。如果您可以更改代碼(因爲您似乎可以)但不想將其更改爲命名類,那麼您是否可以更改變量的名稱,以避免出現範圍問題?你無論如何都應該將其重命名爲清楚起見

1

類是匿名的 - 無名。沒有辦法使用名稱引用訪問他們的字段。沒有名字。