2013-05-15 86 views
4

如何將外部匿名類引用傳遞給Java中的內部匿名類中的方法?通過外部anon類引用內部匿名類中的方法

我有一個方法,使異步調用服務器 - sendCall(some_args, callback)。回調由匿名類表示(我們將其命名爲OuterAnon)幷包含失敗案例的一種方法。在此方法內部會創建一個消息框,並且每次按下OK按鈕時調用sendCall()。所以我需要再次將OuterAnon傳遞給該方法。

這裏是爲了證明什麼,我指的是代碼:

private void sendCall(MyData data, OuterAnon<Boolean> callback){/*...*/} 

private void myCall(final MyData data) { 
     sendCall(data, new OuterAnon<Boolean>() { 
      public void onFailure(Throwable throwable) { 
        final OuterAnon<Boolean> callback = this; //how to avoid this? 
        MessageBox.show(throwable.getMessage(), new MessageListener() { 
         public void process(MessageBox.OnClick action) { 
          if (action == MessageBox.OnClick.OK) { 
           sendCall(new MyData("resend?"), callback); 
          } 
         } 
        }); 
       } 
      } 
     }); 
    } 

正如您所注意到的,我採取了裁判的回調位置:

final OuterAnon<Boolean> callback = this; 

,並在這裏使用它:

sendCall(new MyData("resend?"), callback); 

但我想要避免創建ref和傳遞迴調,如:

sendCall(new MyData("resend?"), this); //at the moment we point to MessageListener instead of OuterAnon. 

有沒有辦法在Java中做到這一點?

+0

由於這裏的外部類也是匿名的,所以我覺得沒有辦法做到這一點,如果有一些名字外類,那麼它可以與。這 – Krushna

+0

@參考Krushna,試圖使用'OuterAnon.this'來訪問它導致一個錯誤:「OuterAnon不是一個封閉的類」 – Dragon

回答

2

我們很難修復,因爲您只顯示不完整的代碼和未提供的類,所以我不知道這個例子在語法上是否正確。話雖這麼說,像這樣的重構會滿足您的需求:

private void myCall(final MyData data) 
    { 
    sendCall(data, new OuterAnon<Boolean>() 
    { 
     public void onFailure(Throwable throwable) 
     { 
     showErrorMessage(throwable); 
     } 
    }); 
    } 

    private void showErrorMessage(Throwable throwable) 
    { 
    MessageBox.show(throwable.getMessage(), new MessageListener() 
    { 
     public void process(MessageBox.OnClick action) 
     { 
     if (action == MessageBox.OnClick.OK) 
     { 
      sendCall(new MyData("resend?")); 
     } 
     } 
    }); 
    } 

    private void sendCall(MyData data) 
    { 
    sendCall(data, this); 
    } 

在一般情況下,我認爲這是一個通常好主意,抽象的代碼進行匿名內部類的插入封閉類自己的方法。它現在是可測試的,可重複使用的,並且更易讀,IMO。

1

如果你真的需要指定內部類裏面的onFailure你顯示代碼的方式,如果你需要用於callback具體提及,你需要以這樣代碼..

讓我們來回答這個問題:no

在我的嘗試中,我已經實現了3種方法來訪問anon-inner-most實例內的anon-inner-least實例,但我認爲沒有一個滿足您的期望。

在這種情況下,anon-inner-most並沒有引用anon-inner-least:如你所說,this現在指向anon-inner-least。

此外,我試圖在java specification搜索,但無法找到問題的答案 - 如果有人在那裏找到答案,請捐助。

我嘗試:

import java.util.ArrayList; 
import java.util.LinkedList; 

public abstract class AnonTest { 

    public static void main(String[] args) { 
     new ArrayList<Object>() { 

      private static final long serialVersionUID = -5986194903357006553L; 

      { 
       // initialize inner anon class 
       add("1"); 
      } 


      // Way 1 
      private Object thisReference1 = this; 

      // Way 2 
      private Object getThisReference2() { 
       return this; 
      } 

      @Override 
      public boolean equals(Object obj) { 
       // Way 3 
       final Object thisReference3 = this; 
       new LinkedList<Object>() { 

        private static final long serialVersionUID = 900418265794508265L; 

        { 
         // initialize inner inner anon class 
         add("2"); 
        } 

        @Override 
        public boolean equals(Object innerObj) { 
         // achieving the instance 
         System.out.println(thisReference1); 
         System.out.println(getThisReference2()); 
         System.out.println(thisReference3); 
         System.out.println(this); 

         System.out.println(); 

         // achieving the class 
         System.out.println(thisReference1.getClass()); 
         System.out.println(getThisReference2().getClass()); 
         System.out.println(thisReference3.getClass()); 
         System.out.println(this.getClass()); 
         System.out.println(this.getClass().getEnclosingClass()); 
         return super.equals(innerObj); 
        } 
       }.equals(""); 
       return super.equals(obj); 
      } 
     }.equals(""); 
    } 
}