首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 別名問題實戰:Alias1/Alias2 範例與副作用防範原則

     編輯:Java 相關知識

別名意指多個參考指向同一物件。若有人寫入該物件,其他參考擁有者若不希望物件改變便會失望。

Alias1:直接指派別名

//: 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:方法呼叫隱式產生別名

//: 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 外部物件被修改!
    }
} ///:~

方法修改參數即修改外部物件。遇此情況必須判斷:是否合理?使用者是否願意?會否造成問題?

通常呼叫方法是為回傳值或改變接收訊息物件狀態。極少為處理參數而呼叫方法——這稱「利用方法的副作用」。若建立修改參數的方法,必須明確警告使用者後果與潛在威脅。應盡量避免修改參數。

解決之道

若需在方法內修改參數卻不想影響外部,應在方法內部製作副本保護參數。本章大多數內容圍繞此問題展開。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved