2011-06-12 46 views
2

有时候我想要一个简单的通用侦听器而不定义自己的类。在Java或Android中是否有预定义的“发生了什么,这里是一个字符串或对象或其他什么”?在Android或Java中是否定义了任何常规侦听器

+0

基本上,这是我想要的。它存在吗? \t public interface SomethingHappenedListener { \t \t public void itHappened(Object object); \t} – 2011-06-12 22:28:25

+0

MVC模型,观察者,Observable应该做你需要的东西 – Siddharth 2013-06-05 04:57:22

回答

2

我曾经参与过的一个项目就是这样的。一旦一个类实现了“MyListener”接口来处理两种完全不同类型的事件,它会导致一些可怕的不可读和不可维护的代码。没有关注的分离,你不知道何时或如何调用该方法。

public interface GenericListener { 
    public void handleMyEvent(Object sourceObj, int eventCode); 
} 

//...later on there's some implementation 
public void handleMyEvent(Object sourceObj, int eventCode) { 
    if (sourceObj == startDownloadButton && eventCode == MyButton.CLICKED) { 
     //... 20 lines of code to start download 
    } else if (sourceObj instanceOf DownloadStatus && eventCode == DownloadStatus.COMPLETE) { 
     //... 10 lines of code to display status 
    } else //... and on and on... 
} 

这不是你需要避免的那种代码重复。仅仅因为两个方法/接口共享相同的基本签名并不意味着它们应该合并成一个。我建议您创建完全自我记录的监听器接口,以了解它们何时以及如何使用它们。

2

有java.util.Observer,但只适用于Observable子类。 (也就是说,任何事物都可以实现Observer接口,但它只能观察Observable对象。)

+1

它是唯一可以在JDK中使用的默认通用事件机制,但是当你使用自己的事件系统时,你的代码将没有那么有意义。 – Snicolas 2011-06-12 22:35:28

+0

据我记得,它们是作为类实现的,而不是接口。当你的班级已经有了父母时,它也会产生问题 – damluar 2011-06-12 22:57:27

0

如果你想避免定义一个监听器类,可以考虑直接在观察的定义回调方法:

abstract class MyWorker{ 

    public MyWorker(){ 
     //...  
     onComplete(); 
    } 

    protected abstract void onComplete(); 

} 

再后来重写它们:

new MyWorker(){ 

    protected void onComplete(){ 
     //.. 
    } 
} 

显然,这是不是适合每情况。有时你需要一个真正的听课。

相关问题