clone() 方法

clone() 方法用於建立和返回物件的副本。應該避免使用這種方法,因為它有問題,並且應該使用複製建構函式或其他一些複製方法來支援 clone()

對於要使用的方法,呼叫該方法的所有類都必須實現 Cloneable 介面。

Cloneable 介面本身只是一個標籤介面,用於改變 native clone() 方法的行為,該方法檢查呼叫物件類是否實現了 Cloneable。如果呼叫者沒有實現此介面,則會丟擲 CloneNotSupportedException

Object 類本身沒有實現這個介面,所以如果呼叫物件是類 Object,則會丟擲 CloneNotSupportedException

要使克隆正確,它應該獨立於克隆的物件,因此可能需要在返回之前修改物件。這意味著通過複製構成被克隆物件內部結構的任何可變物件來實質上建立深層複製 。如果未正確實現,則克隆物件將不是獨立的,並且對可變物件的引用與從其克隆的物件具有相同的引用。這會導致行為不一致,因為對一個行為的任何改變都會影響另一個行為。

class Foo implements Cloneable {
    int w;
    String x;
    float[] y;
    Date z;
    
    public Foo clone() {
        try {
            Foo result = new Foo();
            // copy primitives by value
            result.w = this.w;
            // immutable objects like String can be copied by reference
            result.x = this.x;
            
            // The fields y and z refer to a mutable objects; clone them recursively.
            if (this.y != null) {
              result.y = this.y.clone();
            }
            if (this.z != null) {
              result.z = this.z.clone();
            }
            
            // Done, return the new object
            return result;
            
        } catch (CloneNotSupportedException e) {
            // in case any of the cloned mutable fields do not implement Cloneable
            throw new AssertionError(e);
        }
    }
}