2013-11-14 71 views
1

我知道兩種使用接口的方式。接口實現之間的用例

public interface MyInterface { 
    void myMethod(); 
} 
  1. 方法:使用implements

    public class MyClass implements MyInterface { 
    
        @Override 
        myMethod(){} 
    
    } 
    

    我使用的接口這樣的大部分時間,如果接口是一個合同,如:

    MyInterface foo = new MyClass(); 
    

    現在我可以使用接口提供的方法來控制MyClass。 這對收藏也很好。如果有一些它實現了類MyInterface我有一個共同點:

    List<MyInterface> list = new ArrayList<MyInterface>(); 
    
  2. 方法:使用它作爲一個anonymous class

    public class MyClass { 
        public MyInterface myInterface = new MyInterface(){ 
         @Override 
         public void myMethod(){}    
        }; 
    } 
    

    這個方法我用了回調與dependcy注射這樣的:

    public class MyOtherClass { 
        public MyInterface myInterface; 
    
        // Using setter injection here 
        public void setInterface(MyInterface interface){ 
         myInterface = interface; 
        } 
    } 
    

    MyOtherClass正在調用myInterface.myMethod()它適合。

回調也可以通過使用this pointer的第一種方法來實現。現在我想知道應該使用哪種方法進行回調,爲什麼?我已經看到了兩者,我不知道真正的好處在哪裏。

正如我所看到的,這是我可以在第一種方法和第二種方法之間進行選擇的唯一區別。如果我在這裏錯了,請告訴我另一個區別。我要求這能夠爲不同的情況選擇合適的工具。

另外我想知道另一種情況,但回調,我可以使用第二種方法。

+0

他們是2個不同的東西。第一種方法使用繼承,而第二種方法使用組合。要麼選擇要麼取決於哪一個在界面和類的上下文中更有意義。 – shyam

+0

@shyam這正是我失去的地方,找到正確的背景。 –

回答

1

使用的選擇一個命名或匿名接口實現取決於幾個因素:

  • 你打算重用一些在執行的邏輯? - 如果答案是「是」,請使用第一種方法;否則,使用第二種方法。
  • 您是否需要實施具有大量外部交互的複雜邏輯? - 如果答案是「是」,請使用第一種方法;否則,使用第二種方法。
  • 您的界面是否有多種方法,其中有些可能無意義? - 如果答案是「是」,請使用第一種方法,或者在所有實現都不做任何操作的情況下創建一個「默認」類;否則,使用第二種方法。

最後,這兩種方法之間最大的區別大多是非技術性的:它與你的結果代碼的可讀性有關。畢竟,匿名類比「語法糖」多一點 - 你可以完全用你命名的類來實現你的系統。如果您認爲指定的實現更好,請使用第一種方法;如果您認爲匿名的更好,請使用第二種方法。

+0

所有命名實現應該首選贊成可重用性? –

+0

@SteveBenett有時候,根本沒有可重用性 - 例如,當你的類是一個簡單的管道提供了「粘合邏輯」來連接一個或兩個方法的回調,執行「繁重的工作」。但是,如果您認爲您正在編寫的回調代碼可以重複使用,那麼您絕對應該選擇一個命名類。一種確定的方法是,如果你看到自己將代碼從一個匿名類複製到另一個匿名類。 – dasblinkenlight