java clone打开_java中clone的学习技巧

由于java中的所有东西都是句柄,而且由于每个对象都是在内存堆中创建的——只有不再需要的时候,才会当作垃圾收集掉,所以对象的操作方式发生了变化,特别是在传递和返回对象的时候 。举个例子来说,在C和C++中,如果想在一个方法里初始化一些存储空间,可能需要请求用户将那片存储区域的地址传递进入方法 。否则就必须考虑由谁负责清除那片区域 。因此,这些方法的接口和对它们的理解就显得要复杂一些 。但在Java中,根本不必关心由谁负责清除,也不必关心在需要一个对象的时候它是否仍然存在 。因为系统会为我们照料一切 。我们的程序可在需要的时候创建一个对象 。而且更进一步地,根本不必担心那个对象的传输机制的细节:只需简单地传递句柄即可 。有些时候,这种简化非常有价值,但另一些时候却显得有些多余 。
可从两个方面认识这一机制的缺点:

java clone打开_java中clone的学习技巧

文章插图
(1) 肯定要为额外的内存管理付出效率上的损失(尽管损失不大),而且对于运行所需的时间,总是存在一丝不确定的因素(因为在内存不够时,垃圾收集器可能会被强制采取行动) 。对大多数应用来说,优点显得比缺点重要,而且部分对时间要求非常苛刻的段落可以用方法写成(参见附录A) 。
(2) 别名处理:有时会不慎获得指向同一个对象的两个句柄 。只有在这两个句柄都假定指向一个“明确”的对象时,才有可能产生问题 。对这个问题,必须加以足够的重视 。而且应该尽可能地“克隆”一个对象,以防止另一个句柄被不希望的改动影响 。除此以外,可考虑创建“不可变”对象,使它的操作能返回同种类型或不同种类型的一个新对象,从而提高程序的执行效率 。但千万不要改变原始对象,使对那个对象别名的其他任何方面都感觉不出变化 。
java clone打开_java中clone的学习技巧

文章插图
有些人认为Java的克隆是一个笨拙的家伙,所以他们实现了自己的克隆方案,永远杜绝调用.clone()方法,从而消除了实现和捕获tion违例的需要 。这一做法是合理的,而且由于clone()在Java标准库中很少得以支持,所以这显然也是一种“安全”的方法 。只要不调用.clone(),就不必实现或者捕获违例,所以那看起来也是能够接受的 。
⑤:Doug Lea特别重视这个问题,并把这个方法推荐给了我,他说只需为每个类都创建一个名为()的函数即可 。
【java clone打开_java中clone的学习技巧】Java中一个有趣的关键字是(按值),它属于那些“保留但未实现”的关键字之一 。在理解了别名和克隆问题以后,大家可以想象最终有一天会在Java中用于实现一种自动化的本地副本 。这样做可以解决更多复杂的克隆问题,并使这种情况下的编写的代码变得更加简单和健壮 。