为啥静态变量被认为是邪恶的?

Posted

技术标签:

【中文标题】为啥静态变量被认为是邪恶的?【英文标题】:Why are static variables considered evil?为什么静态变量被认为是邪恶的? 【发布时间】:2011-10-24 23:39:54 【问题描述】:

我是一名刚接触企业界的 Java 程序员。最近我使用Groovy 和Java 开发了一个应用程序。在我编写的所有代码中,都使用了相当多的静态参数。高级技术人员要求我减少使用的静力学数量。我用谷歌搜索过,发现很多程序员都反对使用静态变量。

我发现静态变量使用起来更方便。而且我认为它们也很有效(如果我错了,请纠正我),因为如果我必须对一个类中的一个函数进行 10,000 次调用,我会很高兴将方法设为静态并使用简单的Class.methodCall() on它不是用 10,000 个类的实例来弄乱内存,对吧?

此外,静态减少了对代码其他部分的相互依赖。他们可以充当完美的国家持有者。除此之外,我发现静态在某些语言中广泛实现,例如Smalltalk 和Scala。那么为什么程序员(尤其是在 Java 世界)中普遍存在对静态的反对?

PS:如果我对静态的假设是错误的,请纠正我。

【问题讨论】:

只是为了说,Smalltalk或Scala上没有静态变量或方法,正是因为静态方法和变量违反了OOP原则。 至少你的一个陈述相当奇怪:“静态减少了对代码其他部分的相互依赖”。一般来说,它们会加强依赖关系。进行调用的代码与被调用的代码绑定得非常紧密。之间没有抽象,直接依赖。 你的第二段是关于一个完全不同的主题,即静态方法 函数式编程也对全局状态不屑一顾。如果您曾经(并且您应该)有一天会进入 FP,请准备好抛弃全局状态的概念。 instead of cluttering the memory with 10,000 instances of the class。如果您的方法可以是静态的,则表明它不依赖于状态。如果它不依赖于状态,为什么需要创建 10000 个对象?为什么不在同一个对象上调用它 10000 次呢?除非你打算从 10000 个不同的位置调用它,在这种情况下你显然需要重构你的代码。 【参考方案1】:

假设如果您有一个包含许多用户的应用程序,并且您定义了一个将状态保存在静态变量中的静态函数,那么每个用户都会修改其他用户的状态。

【讨论】:

但在您使用静态变量的情况下,您通常希望覆盖状态,例如适用于所有用户的全局状态。

以上是关于为啥静态变量被认为是邪恶的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥strdup被认为是邪恶的

在java中,为啥类实例也能访问静态域?

C++ 为啥 Traits 在对象上不可用,而是作为静态成员变量可用

为啥允许在这里用非 const 初始化静态变量?

python 为啥要使用静态方法

多线程