文章出處
文章列表
在看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有什么具體作用呢?這個有時間再研究研究吧。
文章列表
全站熱搜