番石榴的EventBus - @Subscribe的可见性

时间:2018-04-10 09:44:01

标签: java guava event-bus greenrobot-eventbus

接口方法的注释不会继承到实现该接口的对象afaik。 SO search results

我想和Guava的EventBus一起使用一个接口,它要求一个对象有一个用@Subscribe注释的回调方法。 我想知道我是否可以简单地将该注释放入接口并让对象实现该侦听器接口。根据{{​​3}},这应该工作。但是,确实有效(参见下面的代码)。

为什么?

我的机器是带有Windows 7的Java 1.8.0_151(32位)。

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

/**
 * This test should fail, but... it works!
 */
public class EventTests {


    @Test
    public void test_events_are_heard() {

        MyListener listener = new MyListener();
        DeafListener deafListener = new DeafListener();
        EventBus bus = new EventBus();
        bus.register(listener);
        bus.register(deafListener);
        bus.post(new MyEvent());
        assertEquals(1, listener.eventCount);     // ok
        assertEquals(0, deafListener.eventCount);   // ok
    }

    // this interface includes the @Subscribe annotation
    private interface Listener {
        @Subscribe
        public void onEvent(MyEvent event);
    }

    // this interface does not include the @Subscribe annotation
    private interface NoListener {
        public void onEvent(MyEvent event);
    }

    // just something different from Object
    private static class MyEvent {
    }       

    // implementation of "Listener" (with @Subscribe in interface)
    private static class MyListener implements Listener {
        int eventCount = 0;
        @Override
        public void onEvent(MyEvent event) {
            eventCount ++;
        }
    }

    // IDENTICAL implementation as above, but of "NoListener" 
    // (without @Subscribe in interface)
    private static class DeafListener implements NoListener {
        int eventCount = 0;
        @Override
        public void onEvent(MyEvent event) {
            eventCount ++;
        }
    }

}

1 个答案:

答案 0 :(得分:3)

你是对的......错了。

你是对的,@Subscribe注释不会被继承。您可以通过进行此类测试MyListener.class.getMethod("onEvent", MyEvent.class).getAnnotation(Subscribe.class) != null来检查它。

但是,如果在界面中定义了订阅方法,感觉

过去this was discussed at length within the Guava team和最小惊喜原则使得如果任何声明方法被注释,那么他们的注册实现被订阅。

我必须承认,我检查了the documentationthe Javadoc并且没有具体查看您的问题,即使它有必要提及。我记得几年前的讨论,必须在封闭的问题上找到答案。