`

Guava的EventBus如何做到监听父类事件的

 
阅读更多
例子:
抛出的事件的int,但是我们的接收器接受的是Number,是int的父类
guava的EventBus是如何做到也能接受的呢:
在post方法的第一行:

 Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass());


比如这里是int,得到的就是int的所有父类:
[class java.lang.Integer, class java.lang.Number, interface java.lang.Comparable, interface java.io.Serializable, class java.lang.Object]

会去查看所有的父类有没有注册接收器,这个做法我是认为有点性能损耗的,但是从功能上看是很好的,而且也是符合人的理解的。




import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;

import org.junit.Before;
import org.junit.Test;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

public class EventBusTest {

	EventBus eventBus;
	NumberTest numberTest = new NumberTest();

	@Before
	public void before() {
		eventBus = new EventBus();
		eventBus.register(numberTest);
	}

	@Test
	public void test() {
		int a = 3;
		eventBus.post(a);
		assertThat(numberTest.a, equalTo(3));
	}

}

class NumberTest {
	int a;

	@Subscribe
	public void onEvent(Number a) {
		this.a = (int) a;
	}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics