在Java中,何时应该使用静态的非final变量?
例如:
private static int MY_VAR = 0;
显然,我们这里不是在谈论常量。
public static final int MY_CONSTANT = 1;
根据我的经验,在使用单例模式时,我经常会为它们辩护,但最终我需要拥有多个实例,这会给我带来很大的麻烦和重构。
似乎在实际应用中很少需要使用单例模式。你怎么看?
统计信息可能使用非最终变量,例如计算创建的实例数量。另一方面,在这种情况下,您可能希望使用AtomicLong
等,此时可以是最终的。或者,如果您正在收集多个统计信息,则可能会出现一个Statistics
类和对其实例的最终引用。
拥有(合理的)非最终静态变量确实相当罕见。
根据我的经验,静态非最终变量只应用于单例实例。其他所有内容都可以更清晰地通过单例(例如缓存)进行封装或使其成为最终(例如记录器引用)。但是我不信奉硬性规定,因此建议您对我提出的建议持保留态度。话虽如此,我建议仔细检查任何情况,在这种情况下,您考虑声明静态非最终变量,并查看是否可以进行重构或以不同方式实现-即将其移动到单例容器中或使用对可变对象的最终引用。
我认为封装静态变量并通过单例(或至少是通过静态方法)提供访问通常是一个好主意,因为这样可以更好地控制访问并避免一些竞争条件和同步问题。
就个人而言,我使用CamelCase符号表示非final类变量。从代码中可以清楚地看出它是一个类变量,因为您必须将其引用为:FooBar.bDoNotRunTests
。
在这方面,我使用this
前缀来区分类实例变量和局部作用域变量。例如:this.bDoNotRunTests
。