Eventbus
学过as3或者js事件流的应该对这个很熟悉了(抽象的addEventlistenter),guava的eventbus基本上可以看成是前者的弱化版。
在gui或者异步编程中,回调模式非常常见,而eventbus就是将这种监听-回调的模式抽象出来。基本上来说,就是一个事件发布者,持有一个eventbus组件,他用这个eventbus来发布事件,然后监听者,则将自己注册到eventbus组件里,两者就靠一个eventbus来进行交流。
一般来说,我们都是传入一个匿名内部类,或者lambda(java8),来作为一个监听器,但是guava的eventbus选择了注解加反射回调的方式,虽然官方说这样用起来更加清晰,但我感觉还是lamda更方便一些。
class EventBusChangeRecorder {
//回调方法 注意这个注解
@Subscribe public void recordCustomerChange(ChangeEvent e) {
recordChange(e.getChange());
}
}
//注册回调方法
eventBus.register(new EventBusChangeRecorder());
//创建并发布事件
ChangeEvent event = getChangeEvent();
eventBus.post(event);
Caches
实现缓存也是编程中相当常见的一类任务,特别是在网络应用中。例如缓存图片,缓存某些复杂算法的结果…
//缓存
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
//最大内存占用,超过后缓存中的部分数据会被回收
.maximumSize(1000)
//写后十分钟回收缓存
.expireAfterWrite(10, TimeUnit.MINUTES)
//移除缓存的监听器
.removalListener(MY_LISTENER)
.build(
new CacheLoader<Key, Graph>() {
//加载数据的方法
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});