java克隆工具
若需修改一个工具,同时不想改变挪用者的工具,就要建造该工具的一个当地副本。这也是当地副本最常见的一种用途。若抉择建造一个当地副本,只需简朴地利用clone()要领即可。Clone是“克隆”的意思,即建造完全一模一样的副本。这个要领在基本类Object中界说成“protected”(受掩护)模式。但在但愿克隆的任何衍生类中,必需将其包围为“public”模式。譬喻,尺度库类Vector包围了clone(),所以能为Vector挪用clone(),如下所示:
//: Cloning.java // The clone() operation works for only a few // items in the standard Java library. import java.util.*; class Int { private int i; public Int(int ii) { i = ii; } public void increment() { i++; } public String toString() { return Integer.toString(i); } } public class Cloning { public static void main(String[] args) { Vector v = new Vector(); for(int i = 0; i < 10; i++ ) v.addElement(new Int(i)); System.out.println("v: " + v); Vector v2 = (Vector)v.clone(); // Increment all v2's elements: for(Enumeration e = v2.elements(); e.hasMoreElements(); ) ((Int)e.nextElement()).increment(); // See if it changed v's elements: System.out.println("v: " + v); } } ///:~
clone()要领发生了一个Object,后者必需当即从头造型为正确范例。这个例子指出Vector的clone()要领不能自动实验克隆Vector内包括的每个工具——由于别名问题,老的Vector和克隆的Vector都包括了沟通的工具。我们凡是把这种环境叫作“简朴复制”可能“浅层复制”,因为它只复制了一个工具的“外貌”部门。实际工具除包括这个“外貌”以外,还包罗句柄指向的所有工具,以及那些工具又指向的其他所有工具,由此类推。这即是“工具网”或“工具干系网”的由来。若能复制下所有这张网,便叫作“全面复制”可能“深层复制”。
在输出中可看到浅层复制的功效,留意对v2采纳的动作也会影响到v:
v: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] v: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
一般来说,由于不敢担保Vector里包括的工具是“可以克隆”(注释②)的,所以最好不要试图克隆那些工具。
②:“可以克隆”用英语讲是cloneable,请寄望Java库中专门保存了这样的一个要害字。