別名意指多個參考指向同一物件。若有人寫入該物件,其他參考擁有者若不希望物件改變便會失望。
//: Alias1.java
public class Alias1 {
int i;
Alias1(int ii) { i = ii; }
public static void main(String[] args) {
Alias1 x = new Alias1(7);
Alias1 y = x; // 指派參考,非新物件
System.out.println("x: " + x.i); // 7
System.out.println("y: " + y.i); // 7
System.out.println("Incrementing x");
x.i++;
System.out.println("x: " + x.i); // 8
System.out.println("y: " + y.i); // 8 受影響!
}
} ///:~
Alias1 y = x 將 x 參考內容(物件位址)指派給 y,兩者連接同一物件。修改 x.i 導致 y.i 同步變化。
//: Alias2.java
public class Alias2 {
int i;
Alias2(int ii) { i = ii; }
static void f(Alias2 handle) { handle.i++; }
public static void main(String[] args) {
Alias2 x = new Alias2(7);
System.out.println("x: " + x.i); // 7
System.out.println("Calling f(x)");
f(x);
System.out.println("x: " + x.i); // 8 外部物件被修改!
}
} ///:~
方法修改參數即修改外部物件。遇此情況必須判斷:是否合理?使用者是否願意?會否造成問題?
通常呼叫方法是為回傳值或改變接收訊息物件狀態。極少為處理參數而呼叫方法——這稱「利用方法的副作用」。若建立修改參數的方法,必須明確警告使用者後果與潛在威脅。應盡量避免修改參數。
若需在方法內修改參數卻不想影響外部,應在方法內部製作副本保護參數。本章大多數內容圍繞此問題展開。