2015-10-06 94 views
0

我重構了我的代碼的一些部分,其中一個有回調函數。我並不確定回調的相關性,因爲它引入了緊密耦合。回調和緊耦合

讓我給你舉個例子:

public class SimpleExample { 
OtherClass oc; 
Callback callback; 
... 

public void register(Callback c) { 
    this.callback = c; 
} 

public void doStuff() { 
    callback.push(oc); 
} 
... 

} 

接口:

public interface Callback { 
public void push(OtherClass oc); 
} 

接口的實現:

public CallbackImpl implements Callback { 
HashMap<OtherClass, String> map; 
... 
public void push(OtherClass oc) { 
    String s = map.get(oc); 
    System.out.println(s); 
} 
... 
} 

主要的問題,我看到的是我的接口使用OtherClass作爲函數參數。值得一提的是,OtherClass不是一個接口。所以我的第一個意思是用接口重構這個類。這是一個不錯的選擇嗎?

+0

它取決於'OtherClass'的可見性範圍。如果它是一個非常公共的對象(例如'String'),那麼沒有必要替換它。如果你打算可能有多個'OtherClass'的實現,那麼替換是一個不錯的選擇,否則'Callback'的任何消費者都需要一個'OtherClass'的實例。 – hotzst

回答

1

是的,這可能是一個好主意。你的回調不應該關心傳遞給它的對象的確切實現。

接口也使嘲笑測試更容易。

我會做的例外是小的,不可變的類,它類似於其他語言的結構。對於這些,實現,內容和界面或多或少都是一樣的。

爲此有一個接口有很多要點嗎?

public final class Point { 

    private final int x; 
    private final int y; 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    Point (final int x, final int y) { 
     super(); 

     this.x = x; 
     this.y = y; 
    } 

    // hashCode etc... 
} 

您還應該考慮爲您的回調使用內置的功能接口。看看Consumer<T>

+0

謝謝,我喜歡你用Point的例子,因爲這意味着它不是強制性的,無處不在。對於功能界面,我會仔細看看,但我不確定它是否有幫助。 – Poke

0

是的,這是一個好主意,因爲你打破了回調和使用它的庫之間的耦合,它將允許你使用來自其他地方的回調,並且允許你自己測試回調不需要其他庫