clone 設計之所以怪異,確有歷史原因。未經證實的內幕故事如下:
Java 最初設計為控制硬體的語言,與網際網路無關。作為大眾化語言,理念是「程式設計師可複製任意物件」,故 clone() 置於根類別 Object 且為 public,看似最靈活無害。
當 Java 成為終極網路程式語言,安全議題浮現:不希望任何人複製機密物件。於是為原本簡單直觀的方案打上大量補丁:
clone() 在 Object 中改為 protectedimplements Cloneable只有準備呼叫 Object.clone() 時才強制檢查 Cloneable(執行期檢查)。為保持一致性(且 Cloneable 為空介面),最好仍自行實作。
這段歷史解釋了為何 clone() 設計顯得支離破碎——它是為了解決後來才出現的安全問題,而在原有架構上層層修補的結果。