EventBus

141 阅读2分钟

主要记录了些关于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,注解,反射,设计模式,线程等相关知识,实现了在进程内的方便通信的一个框架。