Skip to content

Instantly share code, notes, and snippets.

@wszdwp
Created July 16, 2019 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wszdwp/6d61b8531ff137c66323833747f3f248 to your computer and use it in GitHub Desktop.
Save wszdwp/6d61b8531ff137c66323833747f3f248 to your computer and use it in GitHub Desktop.
Java, design

[翻译+摘要]为何要用Copy constructor和不是Cloning 原文: https://www.artima.com/intv/bloch13.html

Cloneable 接口没有提供任何方法,基本上没有要求限制,也没有提供任何方法去copy。

  1. 最终都会叫Object的clone方法。无法对clone实现多态。
  2. Array of cloneable, 无法deep copy array。无法其他东西Cast成Cloneable然后叫clone方法,因为Cloneable和Object都没有公共的clone方法,cast的时候编译器会报错说你在叫Object中的protected clone方法。

Object clone Object clone方法很有陷阱,它是基于field copies,而且有“多余的语义”。它没有叫Constructor创建了Object。这导致Constructor创建的不变性失去了保证。这个问题导致出现很多问题,都终结于反复叫super.clone的chain, 会产生一个shallow copy of the object, clone的Object和原Object共享状态,如果状态是可修改的,其中一个修改会更改状态。

通常我会按照人们期望的那样,提供一个公共的clone方法在一个具体的class上。我不会有抽象类实现cloneable接口,也不会有接口继承clonebale,这样很麻烦

Doug Lea走的更远,他说他不用clone,除非是copy arrays,因为这是最快的方式。但是不要去实现cloneable接口。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment