主要记录了些关于EventBus感觉比较有趣的几个点。
1,在平常使用的时候,都是通过getDefault的方法来获取EventBus对象。在这里使用了单利设计模式。
static volatile EventBus defaultInstance;public static EventBus getDefault() {
EventBus instance = defaultInstance;
if (instance == null) {
synchronized (EventBus.class) {
instance = EventBus.defaultInstance;
if (instance == null) {
instance = EventBus.defaultInstance = new EventBus();
}
}
}
return instance;
}
在new EventBus();的时候,传入一个默认的Builder。
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();public EventBus() {
this(DEFAULT_BUILDER);
}EventBus(EventBusBuilder builder) {
}
这里我感觉是一个比较好玩的一个点。
因为当自己去创建EventBusde的时候,调用空参的构造,其实是使用的已经准备好的Builder对象。那么让过自己来调用带参数的EventBus,却发现该构造方法并没有被public修饰。还不止这样,连EventBusBuilder也没有public修饰。
EventBusBuilder() {
}
那么怎么来创建一个不使用默认builder的Eventbus呢。
EventBus提供了一个静态的builder()方法,直接new了一个对象。通过Builder的链式调用,设置各种参数。
public static EventBusBuilder builder() {
return new EventBusBuilder();
}
再通过EventBusBuilder的 build()方法来创建EventBus。
public EventBus build() {
return new EventBus(this);}
所以,对于创建一个EventBus,我们只能修改的地方就是EventBusBuilder内部的参数。
我觉得EventBus通过单利和Builder的方式完美的实现了迪米特原则。
迪米特原则称之为最少知识原则。
因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大,所以这也是我们提倡的软件编程的总的原则:低耦合,高内聚。
2,享元模式
private List<SubscriberMethod> findUsingInfo(Class<?> subscriberClass) { FindState findState = prepareFindState(); ...
return getMethodsAndRelease(findState);
}
在我看到数组的时候第一个感觉我看错了,因为遍历数组的的时间复杂度是o(n)。在我看到
_POOL_SIZE_了是4的时候,觉得是有趣的。因为,在我的印象里享元模式使用map的比较好,因为map的获取value的时间复杂度接近于o(1)。但是缓存池只有4的长度,反而觉得数组更好一点。毕竟HashMap还要涉及到Node中的hash,key,value,next,还有查找问题。还有Message中的obtain方法类似。
private static final int POOL_SIZE = 4;
private FindState prepareFindState() {
synchronized (FIND_STATE_POOL) {
for (int i = 0; i < POOL_SIZE; i++) {
FindState state = FIND_STATE_POOL[i];
if (state != null) {
FIND_STATE_POOL[i] = null;
return state;
}
}
}
return new FindState();
}
3,EventBus和观察者之间有什么关系? 我觉得这个问题也是比较有趣。
二者之间没有什么关系,EventBus只是采用了观察者的一种思想。内部采用了Apt,注解,反射,设计模式,线程等相关知识,实现了在进程内的方便通信的一个框架。