天天看點

語言之美系列一 - Java篇

     受七周七語言、程式設計語言實作模式等讀物啟發,計劃寫一個語言之美系列博文,因為最近工作上用的比較多的語言是java,是以先從它開刀,希望大家多提寶貴意見~

一. 泛型

(1). 泛型類并沒有自己獨有的class類對象;

(2). 靜态變量是被泛型類的所有執行個體所共享的;

(3). 泛型的類型參數不能用在java異常處理的catch語句中;

(4). list<? extends number>說明list中可能包含的元素類型是number及其子類。而list<? super number>則說明list中包含的是number及其父類;

(5). 泛型繼承體系:

a.相同類型參數的泛型類的關系取決于泛型類自身的繼承體系結構。即list<string>是collection<string>的子類型,list<string>可以替換collection<string>。這種情況也适用于帶有上下界的類型聲明。

b.當泛型類的類型聲明中使用了通配符的時候,其子類型可以在兩個次元上分别展開。如對collection<? extends number>來說,其子類型可以在collection這個次元上展開,即list<? extends number>和set<? extends number>等;也可以在number這個層次上展開,即collection<double>和 collection<integer>等。如此循環下去,arraylist<long>和

hashset<double>等也都算是collection<? extends number>的子類型。

c.如果泛型類中包含多個類型參數,則對于每個類型參數分别應用上面的規則。

(6). 在使用帶通配符的泛型類的時候,需要明确通配符所代表的一組類型的概念。由于具體的類型是未知的,很多操作是不允許的。

(7). 泛型類最好不要同數組一塊使用。你隻能建立new list<?>[10]這樣的數組,無法建立new list<string>[10]這樣的。這限制了數組的使用能力,而且會帶來很多費解的問題。是以,當需要類似數組的功能時候,使用集合類即可。

二. 序列化

(1). 如何有選擇的進行對象圖的序列化,transient? serialpersistentfields?

(2). 安全性問題? 從不同的層次來加強序列化的安全性。

Ⅰ.對序列化之後的流進行加密。這可以通過cipheroutputstream來實作。

Ⅱ.實作自己的writeobject和readobject方法,在調用defaultwriteobject之前,先對要序列化的域的值進行加密處理。

Ⅲ.使用一個signedobject或sealedobject來封裝目前對象,用signedobject或sealedobject進行序列化。

Ⅳ.在從流中進行反序列化的時候,可以通過objectinputstream的registervalidation方法添加objectinputvalidation接口的實作,用來驗證反序列化之後得到的對象是否合法。

三. proxy

       動态生成的代理類有如下一些特點:

(1). 包:如果所代理的接口都是 public 的,那麼它将被定義在頂層包(即包路徑為空),如果所代理的接口中有非 public 的接口(因為接口不能被定義為 protect 或 private,是以除 public 之外就是預設的 package 通路級别),那麼它将被定義在該接口所在包,這樣設計的目的是為了最大程度的保證動态代理類不會因為包管理的問題而無法被成功定義并通路;

(2). 類修飾符:該代理類具有 final 和 public 修飾符,意味着它可以被所有的類通路,但是不能被再度繼承;

(3). 類名:格式是“$proxyn”,其中 n 是一個逐一遞增的阿拉伯數字,代表 proxy 類第 n 次生成的動态代理類,值得注意的一點是,并不是每次調用 proxy 的靜态方法建立動态代理類都會使得 n 值增加,原因是如果對同一組接口(包括接口排列的順序相同)試圖重複建立動态代理類,它會很聰明地傳回先前已經建立好的代理類的類對象,而不會再嘗試去建立一個全新的代理類,這樣可以節省不必要的代碼重複生成,提高了代理類的建立效率.

      由此可見,受限于 java 的語言的類繼承機制,動态代理機制也有其局限,如它不能支援:

(1). 聲明為 final 的類;

(2). 聲明為 final 的函數;

(3). 構造函數均為 private 類型的類。

     要是我非要代理這些類呢? 别急,後面會有位元組碼操作大餐。。。

參考文獻:

1. http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialtoc.html

2. http://download.oracle.com/javase/6/docs/platform/rmi/spec/rmitoc.html

3. http://tutorials.jenkov.com/java-exception-handling/index.html