2014-03-04 66 views
4

我搜索了這一點,但遺憾的是沒能找到比賽,我有這個local anonymous inner class這樣的方法中: -建立一個匿名內部類,並調用其方法

new Object(){ 
    public void open(){ 
     // do some stuff 
    } 
    public void dis(){ 
     // do some stuff 
    } 
}; 

2 methods(open,dis)內,我知道,如果我想使用它們的人只是做

new Object(){ 
    public void open(){ 
     // do some stuff 
    } 
    public void dis(){ 
     // do some stuff 
    } 
}.open() 

現在我的問題是什麼如果我想這兩個方法調用,同時我怎樣才能做到這一點

+1

的一種方式可能是有'open'回報'this'和鏈的調用。 – njzk2

+0

@ njzk2我想過這個。但在這種情況下,什麼類型應該「開放」返回? –

+0

這有很強的「代碼味道」。如果你需要調用這兩種方法,唯一的方法就是返回'this'和鏈接,但是這會佔用返回機制,並且會損害非設置方法的任何自然返回類型。如果你需要調用這兩種方法,你需要一個真正的課程。 –

回答

6

您可以創建一個像這樣的接口:

interface MyAnonymous { 
    MyAnonymous open(); 
    MyAnonymous dis(); //or even void here 
} 

new MyAnonymous(){ 
    public MyAnonymous open(){ 
     // do some stuff 
     return this; 
    } 
    public MyAnonymous dis(){ 
     // do some stuff 
     return this; 
    } 
}.open().dis(); 

編輯----

由於@Jeff指出,需要對接口只有在引用分配。 事實上,下面的溶液(@JamesB誘發)是完全有效的:

new MyObject(){ 
     public MyObject open(){ 
      // do some stuff 
      return this; 
     } 
     public MyObject dis(){ 
      // do some stuff 
      return this; 
     } 
    }.open().dis(); 

,但這不會編譯:

MyObject myObject = new MyObject(){ 
      public MyObject open(){ 
       // do some stuff 
       return this; 
      } 
      public MyObject dis(){ 
       // do some stuff 
       return this; 
      } 
     }; 
myObject.open().dis(); //not compiling since anonymous class creates a subclass of the class 
+0

@Jim感謝您的即時編輯;)我錯過了最重要的;) – Mik378

+0

你甚至不需要真正的'interface'。如果你有'接口',就沒有必要鏈接方法調用或者在對象實例化後立即調用它們,這要歸功於多態性。您不必讓方法自行返回。 – asteri

+0

@Jeff我並不嚴格需要一個接口,但OP沒有提供完整的上下文來確認我可以繞過它。順便說一句,對你的第二件事不同意:鏈接與'多態'概念無關,它只是一種簡潔的代碼,在某些情況下很有用:http://en.wikipedia.org/wiki/Fluent_interface 。 – Mik378

1
new MyObject(){ 
    public MyObject open(){ 
     // do some stuff 
     return this; 
    } 
    public MyObject dis(){ 
     // do some stuff 
     return this; 
    } 
}.open().dis(); 
+0

中的方法「MyObject無法解析爲類型」。這不是完整的答案。 – exception1

+0

@ exception1你必須在某個地方實際上有一個叫做「MyObject」的類。如果示例中使用了「Object」,它會爲你編譯。 – asteri

+2

你的答案假設'MyObject'存在並且已經定義(在上面)那些方法。 – Mik378

1

如果你想從一個匿名類調用方法,這意味着它擴展了超類或實現了一個接口。所以,你可以簡單地存儲在父母的引用,實例和它調用的所有合同的方法:

interface MyAnonymous { 
    void open(); 
    void dis(); 
} 

MyAnonymous anon = new MyAnonymous() { 
    public void open(){ 
     // do some stuff 
    } 
    public void dis(){ 
     // do some stuff 
    } 
}; 

anon.open(); 
anon.dis(); 
+0

下面的所有評論解釋了爲什麼界面不需要,哈哈;) – Mik378

+0

當然,這不是重點;關鍵是要有父母的參考 – robermann

+0

是的,但是OP從未提及父母參考的純粹必要性。 – Mik378