2015-10-06 107 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

是的,这是一个好主意,因为你打破了回调和使用它的库之间的耦合,它将允许你使用来自其他地方的回调,并且允许你自己测试回调不需要其他库