我以前没有使用过很多静态方法,但最近我倾向于使用更多静态方法。例如,如果我想在类中设置一个布尔标志,或者访问一个类而不需要通过类传递实际对象。
例如:
public class MainLoop
{
private static volatile boolean finished = false;
public void run()
{
while ( !finished )
{
// Do stuff
}
}
// Can be used to shut the application down from other classes, without having the actual object
public static void endApplication()
{
MainLoop.finished = true;
}
}
这是我应该避免的事情吗?传递一个对象以便您可以使用对象方法是否更好?是否是布尔值finished
现在算作全球性的,还是同样安全?
在这种情况下使用静态变量的一个问题是,如果您创建两个(或更多)MainLoop 实例,则编写看起来只关闭其中一个实例的代码,实际上会关闭它们两个:
MainLoop mainLoop1 = new MainLoop();
MainLoop mainLoop2 = new MainLoop();
new Thread(mainLoop1).start();
new Thread(mainLoop2).start();
mainLoop1.finished = true; // static variable also shuts down mainLoop2
这只是选择不使用静态变量的原因之一(众多原因之一)。即使您的程序今天只创建一个 MainLoop,将来您也可能有理由创建其中许多:用于单元测试,或实现一项很酷的新功能。
您可能会想“如果发生这种情况,我只会重构程序以使用成员变量而不是静态变量。”但预先支付成本并从一开始就将模块化设计融入到程序中通常会更有效。
毫无疑问,静态通常会使快速而肮脏的程序更容易编写。但对于您打算在未来几年测试、维护、增长、共享和使用的重要/复杂代码,通常建议不要使用静态变量。
正如这个问题的其他答案所指出的,静态变量是一种全局变量。有很多关于原因的信息(通常)global http://c2.com/cgi/wiki?GlobalVariablesAreBad 变量 https://stackoverflow.com/questions/872943/why-are-global-variables-bad-in-a-single-threaded-non-os-embedded-application are https://stackoverflow.com/questions/484635/are-global-variables-bad bad http://bytes.com/topic/c/insights/737451-case-against-global-variables.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)