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

时间:2009-04-08 18:26:26

标签: java static

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

例如

private static int MY_VAR = 0;

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

public static final int MY_CONSTANT = 1;

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

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

7 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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