Java的面向对象的代码结构会使在多个位置引用变量更加困难。有时也很难确定给定变量应属于哪个类,尤其是当它是一个广泛使用的值(例如数据库连接器或数学常数)时。
Java全局变量怎么定义?
在许多语言中,当遇到这样的问题时,我们可以声明一个全局变量。但是,不幸的是,Java从技术上不允许在全局范围内创建变量。
在本文中,我们将介绍如何在Java中模拟和使用全局变量。
什么是全局变量?
全局变量是可以从任何范围访问的变量。许多编程语言都具有用于声明全局变量的特殊语法,例如,Python使我们可以使用global关键字:
global a_variable = 5
C通过简单地在函数外部声明变量来创建全局变量。
int aVariable = 3;
int someFunction() {
print(aVariable);
}
无论创建全局变量的语法如何,它们的工作方式大致相同。它们允许您从任何其他类或函数内部访问和修改值。如果您尝试在另一个作用域中重用该名称,则可能导致问题。例如:
int aVariable = 3;
int someFunction() {
int aVariable = 7;
print(aVariable);
}
根据语言,通常以以下三种方式之一来处理:
声明已存在的变量时引发错误。
假设打印语句引用局部变量。
假定print语句引用局部变量,除非使用特殊语法引用全局变量。
第三种方法是当方法参数使用相同名称时Java如何处理实例变量。描绘一个类,该类的变量声明为private int number。要修改以后的值number,您可以创建一个函数:
public int setNumber(int number) {
this.number = number;
}
在this你想要的关键字显示number从类,而不是从方法的参数。
Java为什么不使用全局变量?
这个问题的简短答案是:故意设计。Java被创建为纯粹的面向对象的编程语言,这就是为什么您创建的所有内容都包装在一个类中的原因。
通过纯粹面向对象,鼓励开发人员将相关的变量和函数保持在一起,从而使程序整体上更有条理。这也可以帮助确定文档记录不充分的目的。例如:
class GridCoordinate {
int x;
int y;
}
如果不知道这些变量是GridCoordinate类的一部分,则几乎不可能识别它们。通过类名的上下文,我们可以推断出它们是网格上给定点的水平和垂直位置。
现在想象一下您正在与一个遍布全球的成员组成的完全远程团队一起工作。当您遇到以下问题时,您和另一大陆的同事都在处理同一个文件:
global ver = 2.55
您假设变量代表版本号。您的同事认为这可能与垂直轴有关。你们都根据自己的假设对不同的功能进行了更改,并根据需要修改和引用了该值。
订阅我们的新闻
在收件箱中获取临时教程,指南和作业。从来没有垃圾邮件。随时退订。
订阅电子报
订阅
这是Java试图通过没有全局变量来避免的那种情况。在大型项目中使用全局变量会导致意外和意外的行为,因为在代码的不同部分中声明和修改了变量。
如何在Java中模拟全局变量?
尽管使用全局变量有一些缺点,但有时您可能希望在许多地方访问变量,但是您可能会觉得不保证创建专用包装类。
例如,您可能想在多个类中引用数据库连接,但没有声明一个DatabaseConnection类来处理所有数据库功能。您可能还希望只使用选择的数据库库中的内置方法,而无需使用包装程序来处理事务。
通常,您可以创建一个Constants或一个Reference类,如果各种“全局”值通常在应用程序的其他部分中使用,则可以在其中存储各种“全局”值。单个变量并不一定要保证整个类,因此您可以将多个变量包含在一个Reference或一个Constants类中:
public class Reference {
public static final double VERSION_NUMBER;
public static final String DATABASE_URL;
public static final Database DATABASE;
}
然后可以通过引用该类在其他位置访问这些变量:
public int someMethod() {
System.out.println(Reference.VERSION_NUMBER);
}
使用Reference该类可以很容易地知道在哪里可以找到解释变量目的的注释。如果上面的变量被创建为真正的全局变量,则很可能在不同的文件中创建了它们,这使得查找作者的预期目的变得更加困难。
使用Reference该类的一种更好的方法是将所有变量都视为私有变量,并使用getter方法控制对值的所有访问。对于在程序运行时不应更改的数据,使用常量而不是变量也是明智的。例如:
private static final String DATABASE_URL = "https://databaseurl.db/database";
private static final Database DATABASE = Database.connect(databaseURL);
public static Database getDatabase() { return DATABASE; }
public static String getUrl() { return DATABASE_URL}
在此示例中,无法在代码中的其他任何地方修改数据库URL和数据库连接,但是可以根据需要引用数据库连接以进行事务处理。
虽然这在语法上不像定义全局变量那样干净,但是它可以提供相同级别的自由度。
另一个常见用法是在应用程序中定义一些常量,这些常量具有您经常使用的不可变值。例如,如果您正在训练神经网络或运行遗传算法,那么到处都会使用各种值:
public static final int GENERATION_SIZE;
public static final int GENOME_SIZE;
public static final int REPRODUCTION_SIZE;
public static final int MAX_ITERATIONS;
然后,您将通过他们的公共课程访问这些内容,例如:
for(int i = 0; i < Constants.MAX_ITERATIONS; i++) {
// ...
}
结论
全局变量通常被视为一个分裂的话题,许多开发人员表示,永远不要使用它们。这些开发人员通常认为,全局变量使代码难以维护。但是,在某些情况下,只要全局变量良好地组织并清楚地标识它们,它们就很有用。
最终,使用它们的决定权在您或开发团队的高级成员身上。
分享一些Java基础和进阶的学习资料给大家看看吧!不管是进阶提升还是基础入门都很有用。
目录
目录.png内容截图
合集.png这套文档涵盖的内容实再太过于全面,不论是成长进阶还是应对面试,都绰绰有余了。一共有上百万字,都为大家展示出来肯定是不太现实的,为了不影响大家的阅读体验就只展示了部分内容,还望大家海涵。
网友评论