為什么在java.lang.Object中保護clone()方法?clone()定義為受保護的具體原因是java.lang.Object什么?
3 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
克隆被保護的事實是非??梢傻?- 因為該clone
方法未在Cloneable
接口中聲明。
這使得該方法對于獲取數據副本毫無用處,因為您無法說:
if(a instanceof Cloneable) { copy = ((Cloneable) a).clone();}
我認為,設計Cloneable
是現在很大程度上被視為一個錯誤(以下引文)。我通常希望能夠實現接口Cloneable
但不一定要創建接口Cloneable
(類似于使用Serializable
)。沒有反思就無法做到這一點:
ISomething i = ...if (i instanceof Cloneable) { //DAMN! I Need to know about ISomethingImpl! Unless... copy = (ISomething) i.getClass().getMethod("clone").invoke(i);}
來自Josh Bloch的Effective Java的引用:
“Cloneable接口旨在作為一個mixin接口,用于對象宣傳它們允許克隆。不幸的是它無法達到此目的......這是一種非常非典型的接口使用,而不是一個被模擬的接口...為了實現接口對類產生任何影響,它和它的所有超類必須服從一個相當復雜,不可執行且基本上沒有文檔的協議 “

江戶川亂折騰
TA貢獻1851條經驗 獲得超5個贊
clone
是受保護的,因為它應該被覆蓋,以便它特定于當前類。雖然可以創建一個clone
克隆任何對象的公共方法,但這不如專門針對需要它的類編寫的方法那么好。
添加回答
舉報
0/150
提交
取消