2015-04-26

MicroBus

使用

注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Receiver implements MicroBus.BusEventReceiver {

public onCreate() {
bus.register(this, String.class);
}

public onDestroy() {
bus.unregister(this, String.class);
}

@Override
public void onBusEvent(Object event) {
if (event instanceof String)
System.out.println("Hello, " + event);
}
}

运行

bus.post("World|");

运行结果

Hello, World!
更多 →
2015-04-23
更多 →
2015-04-11
更多 →
2015-04-07
更多 →
2015-04-06
更多 →
2015-03-28
更多 →
2015-03-12
更多 →
2015-01-20
更多 →
2015-01-02
更多 →
2014-12-19

VarArgs简述

只需要明确一点即可,java方法的变长参数只是语法糖,其本质上还是将变长的实际参数 varargs 包装为一个数组。

所以

Object[] objs

Object... objs

被看作是相同的签名,在源码级别是不能同时存在的,因此,无法编译通过

VarArgs包装

包装方式(注意,下面的代码不是实际的实现,而是一个比喻说明):

  1. 如果实参是唯一且匹配形参varargs要求的数组(就是实参独占形参varargs),那么可以认为你已经替编译器干了这个活,所以可以看作不包装,直接使用这个数组
1
2
3
4
5
6
7
public void invoke(String...varargs){}

invoke(new String[]{"a", "b", "c"});
那么大致的调用过程如下:
public void invoke(String...varargs){
innerVarArgs = varargs;
}
  1. 如果实参是多个单独的变量(就是多个实参分享varargs),那么会将这多个参数包装成一个相应的类型数组
1
2
3
4
5
6
7
8
9
10
11
public void invoke(String...varargs){}

invoke("a", "b", "c");

那么大致的调用过程如下:
public void invoke(String...varargs){
innerVarArgs = new String[varargs.length];
for(int i = 0, size = varargs; i < size; i++){
innerVarArgs[i] = varargs[i];
}
}
更多 →