JavaRush /Java 博客 /Random-ZH /Java 中的全局变量:何时使用它们?
Анзор Кармов
第 31 级
Санкт-Петербург

Java 中的全局变量:何时使用它们?

已在 Random-ZH 群组中发布
你好!在本文中,我们将讨论全局变量、它们的声明和适当使用的示例。小提示:我们不会考虑全局类变量,即那些可以在任何一个类中访问的变量。我们将讨论整个应用程序的全局变量 - 那些可以在整个应用程序内访问的变量。 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