之所以感覺這個方案的奇特,因為它事實上的確如此。也許大家會奇怪它為什麼要象這樣運行,而該方案背後的真正含義是什麼呢?後面講述的是一個未獲證實的故事——大概是由於圍繞Java的許多買賣使其成為一種設計優良的語言——但確實要花許多口舌才能講清楚這背後發生的所有事情。
最初,Java只是作為一種用於控制硬件的語言而設計,與因特網並沒有絲毫聯系。象這樣一類面向大眾的語言一樣,其意義在於程序員可以對任意一個對象進行克隆。這樣一來,clone()就放置在根類Object裡面,但因為它是一種公用方式,因而我們通常能夠對任意一個對象進行克隆。看來這是最靈活的方式了,畢竟它不會帶來任何害處。
正當Java看起來象一種終級因特網程序設計語言的時候,情況卻發生了變化。突然地,人們提出了安全問題,而且理所當然,這些問題與使用對象有關,我們不願望任何人克隆自己的保密對象。所以我們最後看到的是為原來那個簡單、直觀的方案添加的大量補丁:clone()在Object裡被設置成“protected”。必須將其覆蓋,並使用“implement Cloneable”,同時解決違例的問題。
只有在准備調用Object的clone()方法時,才沒有必要使用Cloneable接口,因為那個方法會在運行期間得到檢查,以確保我們的類實現了Cloneable。但為了保持連貫性(而且由於Cloneable無論如何都是空的),最好還是由自己實現Cloneable。