在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧。
先看一段代码:
代码1
这段代码中有一个new的操作,而且是在方法参数中进行的,这给了我一个好奇的点。此时首先想到的是C#中的匿名类,于是网上找了找资料,确实是类似的语法特性。继续看代码就发现一个问题:
ConfigurableServerChannel是一个接口,而且Initializer是ConfigurableServerChannel中的一个内部嵌套接口。
代码2
这就有另一个问题,接口怎么就可以实例化呢?还是代码1中的代码,发现其实例化时是直接包含了一段实现,并且实现了configureChannel方法。这就说明直接实现了一个类来继承Initializer接口。这里匿名类就显身了。
也就是说代码看起来是在实例化一个接口,实际上是通过匿名类的机制实现了一个类,并且动态创建这个匿名类的实例。
这样写的好处是很明显的,使用接口来约定,在具体使用时再实际使用业务代码。这样做代码也精简了许多,不需要创建一堆的java代码单元。但如果类需要具名且重复使用的话那么就不太适合使用这种做法,否则会产生许多重复的代码。
在看代码的时候学到另一个知识,就是原来接口里也可以有实现,看代码2中的Persistent静态类是直接继承实现了Initializer接口。这种写法第一次见,想了半天也没太明白怎么回事。于是写个例子自己跑跑看:
代码3
上面的代码运行的结果如下:
I am object instance: A
I am StaticClass: B
我了个去,好吧,有点不淡定了。原来静态类也可以实例化!!!!!!为了确认此问题我把StaticClass的的static给去掉,运行的结果是一样的,那么我就不知道这个static有什么具体作用呢?这个有时间再研究研究吧。