JavaRush /Java Blog /Random-TW /Java 中的全域變數:何時使用它們?
Анзор Кармов
等級 31
Санкт-Петербург

Java 中的全域變數:何時使用它們?

在 Random-TW 群組發布
你好!在本文中,我們將討論全域變數、它們的宣告和適當使用的範例。小提示:我們不會考慮全域類別變量,也就是那些可以在任何一個類別中存取的變數。我們將討論整個應用程式的全域變數 - 那些可以在整個應用程式內存取的變數。 Java 中的全域變數:何時使用它們? - 1

如何建立全域變數

全域變數是可以從應用程式中的任何位置存取的變數。換句話說,它們的範圍是整個應用程式。要在Java中建立這樣的變量,您需要在公共類別中建立一個公共靜態變數:
public class Example {
    public static int a;
    public static int b;
    public static String str;
}
變數a,bstr- 已成為全域變數。我們可以直接從應用程式內的其他類別存取它們:
public class GlobalVarsDemo {
    public static void main(String[] args) {
        Example.a = 4;
        Example.b = 5;
        Example.str = "Global String variable value";

        System.out.println(Example.a);
        System.out.println(Example.b);
        System.out.println(Example.str);
    }
}
如果我們運行該方法main,我們將看到以下輸出:

4
5
Global String variable value
全域變數可以分為2種類型:
  • 可編輯的變數;
  • 只能讀取的變數。
後者稱為全域常數。為了建立全域常數,您需要建立一個變數final並在定義變數時為其賦值:
public class Constants {

    public static final double PI = 3.1415926535897932384626433832795;
    public static final String HELLO_WORLD_STR = "Hello, World!";

}
根據Java命名約定,所有常數都必須以大寫命名,並用下劃線字元分隔單字。所以,我們已經創建了常數,現在我們將無法更改它們的值:Java 中的全域變數:何時使用它們? - 2但是,我們可以讀取它們的值:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(Constants.HELLO_WORLD_STR);
    }
}
結論:

Hello, World!
public class ConstantsDemo {
    public static void main(String[] args) {
        double r = 10;
        String message = String.format("Площадь круга с радиусом %f=%f", r, getCircleSquare(r));
        System.out.println(message);

    }

    static double getCircleSquare(double r) {
        return Constants.PI * r * r;
    }
}
結論:

Площадь круга с радиусом 10,000000=314,159265

你應該使用全域變數嗎?

網路上有很多文章,其主要資訊就是:全域變數是邪惡的、不好的、可怕的。是不是真的?讓我們試著給出全域變數的優缺點,以便每個人都能得出自己的結論。Java 中的全域變數:何時使用它們? - 3讓我們從缺點開始。讓我們想像一個應用程式有一個帶有可以讀取和編輯的全域變數的類別。隨著時間的推移,項目中的類別數量、全域變數和使用全域變數的方法的數量(或者換句話說,依賴它們的方法的數量)都會增加。隨著時間的推移,系統的不同部分會出於不同的目的讀取每個全域變數。在系統的不同部分,變數的值可以被更新。該應用程式的整體情況變得更加複雜,這導致了以下缺點
  1. 可讀性降低並增加了理解程式碼的難度。
  2. 增加了程式碼維護的複雜度。
  3. 要變更一個全域變量,需要分析整個程式碼,以免將該變數設定為對系統其他部分無效的值。
  4. 難以調試的錯誤增加。

    讓我們想像一個全域變量,一個物件數組。例如,在系統的一部分中,該陣列中需要字串,而在系統的另一部分中,有人決定使用浮點數。不太可能有人願意理解這一點。

  5. 如果您在程式碼中使用全域變量,以及一些也使用全域變數的函式庫,則變數名稱可能相同。這可能會導致您的應用程式方面和您正在使用的庫方面出現錯誤。
  6. 增加使用全域變數的系統不同部分之間的連接性。相反,您應該努力實現程式碼的鬆散耦合。擁有許多彼此鬆散連接的小型子系統比擁有一個笨重的東西要好。因為大腦處理幾個簡單的事情比處理一件過於複雜和令人困惑的事情更容易。
  7. 編寫單元測試變得更加困難,因為測試不知道需要哪些全域變數以及如何初始化它們。
  8. 在多執行緒應用程式中,不同執行緒使用全域變數會導致難以偵錯的錯誤增加,並導致專案複雜性增加。因此,有必要更正確地配置對這些變數的訪問,為它們配備同步和鎖定。這可能會導致將來發生短路。例如,線程A為其工作鎖定了變數X,線程B為其工作鎖定了變數Y,線程A現在需要變數Y,線程B需要變數X。結果,程式將凍結。
但這都是不準確的。這是對風險的描述,風險的可能性隨著專案的成長和其中全局變數數量的增加而增加。 讓我們繼續討論優點
  1. 在小型專案中,全域變數是使專案正常運作的最簡單的方法。
  2. 有時,擔心使用全域變數會導致專案變得更加複雜。然後程式設計師開始創建單例並訴諸其他設計模式。
  3. 在程式設計中,您經常需要依賴一些不可變的值。

    最合理的就是把這樣的值寫成常數,因為只有常數才能保證變數的值不會隨著時間的推移而改變。這樣的常數隨時都可以找到(Integer.MAX_VALUEInteger.MIN_VALUEBoolean.TRUECollections.EMPTY_LIST)。但程式設計並不限於使用標準函式庫。您經常需要編寫某種獨特的邏輯,這需要依賴您自己的獨特常數。這就是為什麼有時使用常數(只讀全域變數)確實讓生活變得更輕鬆。

一般來說,不應過度使用全域變數;如果可能,僅使用常數。前面說過,在小專案中使用全域變數也不錯。但對於新手開發人員來說,最好根本不要使用它們。有兩個原因:
  1. 新手開發人員編寫的所有內容本質上都是一個小專案。在他的專案中使用全域變數將教會他在任何地方使用全域變數。
  2. 最好先學會不使用「禁忌技巧」。隨著經驗的積累,人們會自然而然地了解何時適合使用此類技術。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION