为什么有这个奇怪的设计
之所以感受这个方案的怪异,因为它事实上简直如此。也许各人会奇怪它为什么要象这样运行,而该方案背后的真正寄义是什么呢?后头报告的是一个未获证实的故事——或许是由于环绕Java的很多交易使其成为一种设计优良的语言——但确实要花很多口舌才气讲清楚这背后产生的所有工作。
最初,Java只是作为一种用于节制硬件的语言而设计,与因特网并没有丝毫接洽。象这样一类面向公共的语言一样,其意义在于措施员可以对任意一个工具举办克隆。这样一来,clone()就安排在根类Object内里,但因为它是一种公用方法,因而我们凡是可以或许对任意一个工具举办克隆。看来这是最机动的方法了,究竟它不会带来任何害处。
合法Java看起来象一种终级因特网措施设计语言的时候,环境却产生了变革。溘然地,人们提出了安详问题,并且理所虽然,这些问题与利用工具有关,我们不肯望任何人克隆本身的保密工具。所以我们最后看到的是为本来谁人简朴、直观的方案添加的大量补丁:clone()在Object里被配置成“protected”。必需将其包围,并利用“implement Cloneable”,同时办理违例的问题。
只有在筹备挪用Object的clone()要领时,才没有须要利用Cloneable接口,因为谁人要了解在运行期间获得查抄,以确保我们的类实现了Cloneable。但为了保持连贯性(并且由于Cloneable无论如何都是空的),最好照旧由本身实现Cloneable。