最佳实践:Java静态非最终变量

在Java中,何时应该使用静态非最终变量?

例如

private static int MY_VAR = 0; 

显然我们不是在谈论常数。

 public static final int MY_CONSTANT = 1; 

根据我的经验,我经常在使用单身时certificate他们是合理的,但后来我最终需要有多个实例并导致自己非常头痛和重新分解。

它们似乎很少应该在实践中使用。 你怎么看?

统计信息收集可能使用非最终变量,例如计算创建的实例数。 另一方面,对于那种情况,你可能想要使用AtomicLong等,这时它可以是最终的。 或者,如果您收集多个统计信息,最终可能会得到一个Statistics类以及对其实例的最终引用。

拥有(合理地)非最终静态变量肯定是非常罕见的。

当用作缓存时,记录,统计或调试开关是显而易见的合理用途。 当然,都是私人的。

如果您将可变对象分配给最终字段,则在道德上与具有可变字段相同。

有些语言,如Fan,完全不允许使用可变静态(或等效的)。

根据我的经验,静态非final变量只应用于单例实例。 其他所有内容都可以由单例(例如缓存)更清晰地包含,或者最终(例如记录器引用)。 但是,我不相信严格的规则,所以我会毫不犹豫地接受我的建议。 这就是说我会建议仔细检查你认为除了单例实例之外声明一个非最终静态变量的任何情况,看看它是否可以被重构或以不同的方式实现 – 即移入单例容器或使用对可变的最终引用目的。

静态变量可用于控制应用程序级行为,例如指定全局日志记录级别,要连接的服务器。

我在旧的应用程序中遇到过这样的用例,通常来自其他公司。

现在使用静态变量显然是不好的做法 ,但在1999年它并不那么明显。没有Spring,没有log4j,没有来自RCMartin等的清洁代码。

Java语言现在已经很老了,即使现在强烈建议不要使用某些function,它也经常在开头使用。 而且由于向后兼容性,它不太可能改变。

我认为包装静态和通过单例提供访问(或至少通过静态方法)通常是一个好主意,因为您可以更好地控制访问并避免一些竞争条件和同步问题。

静态变量意味着它可以作为一个整体用于类,因此这两个示例都可以作为一个整体用于类。 最终意味着该值无法更改。 所以我想问题是你希望什么时候一个值可供整个类使用,并且在实例化之后它不能被更改。 我的猜测是该类的所有实例化都可用的常量。 否则,如果您需要像人口计数器这样的东西,那么非最终变量。

对于类非final变量,我个人使用CamelCase表示法。 从代码中可以清楚地看出它是一个类变量,因为你必须这样引用它: FooBar.bDoNotRunTests

在这方面,我使用this为类实例变量添加前缀,以区别于本地范围变量。 恩。 this.bDoNotRunTests