什么样的全局变量在java中是不好的做法?
对于我的许多java项目,我广泛使用数据库,我通常做的是有一个property.xml
文件来保存我的所有字符串和设置。
然后我会有一个类CNST
来保存与xml文件中的静态常量相对应的所有静态常量。
这些常量在程序启动时由xml文件初始化一次,并在程序中的任何地方用作全局变量。
然而,在阅读了这些日子的许多文章后,似乎根本不使用全局变量就不是一个好习惯。 所以,任何人都可以指出这种情况的良好做法吗? 谢谢。
一般情况下,应该避免全局变量=>但如果它们是常量则不是问题。 对于像这样的情况,当您(可能)在开始时初始化此全局设置包装器对象并且之后没有任何更改时,有以下选项:
- 具有在
static
块中初始化的常量(public static final
) - 让变量
private static final
在static
块中初始化并通过getter公开 - 创建一个单例并使变量
private final
通过getter公开
第2点和第3点比第1点更有优势,在getter方法中,你已经封装了变量的值,并且可以更改/插入代码,这些代码操纵要返回给调用方法的值,而不会影响依赖于它的(调用)代码。
使用全局变量意味着许多可以操作数据的类都可以看到它们。
所以你必须要处理你的数据,因为它是广泛可见的。
如果你使用multithreading,那么你就会遇到麻烦,因为任何人都可以修改这些数据,因此很多数据的范围都会被破坏。
作为一种实践,我遵循以下几点:
- 如果可能的话,保持可变的visiblity最小,私密。
- 尽可能让它永不变化。
您可以自由使用公共静态常量或变量。 如果您使用非静态变量,那么良好的做法是使用Getters和Setters。 如果您的类只包含静态常量,那么您还可以使用私有构造函数来限制创建此类的实例。
public class Global { public static final int A; public static final int B; private Global() {} // use only when you have only static fields and methods static { A = 1; B = 2; } }
您可以创建一个public static
变量而不是全局变量,这将是一个更好的主意。
看看这个链接 。
另一种方法是创建一个遵循singleton
模式的类,因此只能有一个类的实例,并将变量保存在单例类中,并使用get
和set
方法访问它。
EDIT1: –
在声明常量的情况下寻找旧样式。 像这样: –
(public/private) static final TYPE NAME = VALUE;
在这种情况下,我不建议创建一个类。