当前位置: 首页 > 面试题库 >

Java-为什么静态变量被认为是邪恶的?

万俟沛
2023-03-14
问题内容

我是一位Java程序员,对公司领域来说是新手。最近,我已经使用Groovy和Java 开发了一个应用程序。我编写的所有代码都使用了大量的静态变量。高级技术人员要求我减少使用的静电数量。我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。

我发现静态变量更易于使用。而且我认为它们也是有效的(如果我错了,请纠正我),因为如果我必须对一个类中的一个函数进行10,000次调用,我将很高兴使该方法静态化并对其使用直接方法Class.methodCall(),而不是10,000个类的实例使内存混乱,对吗?

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

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


问题答案:

静态变量表示全局状态。这很难推理,也很难测试:如果创建对象的新实例,则可以在测试中推断其新状态。如果我使用的代码使用的是静态变量,则它可能处于任何状态-任何事情都可能对其进行修改。

我可以继续进行一段时间,但是要考虑的更大概念是,事物的范围越紧密,就越容易进行推理。我们善于思考小事情,但是如果没有模块化,就很难对一百万行系统的状态进行推理。顺便说一下,这适用于各种各样的事物,而不仅仅是静态变量。



 类似资料:
  • 我试图找出为什么使用在python(以及一般编程)中被认为是不好的做法。有人能解释一下吗?更多信息的链接也将不胜感激。

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 在这个问题中,有什么方法可以只接受JTextField中的数值吗?答案之一表明JFormattedTextField存在问题。 我还没有使用过它,但是有人可以

  • 根据我的理解,如果子例程不作用于类的实例(其作用仅限于显式输入/输出),则它是;如果子例程作用于类的实例,则它是(它可能会对实例产生副作用,使其不纯)。 关于这个话题,这里有一个很好的讨论。请注意,根据接受答案的定义,静态实际上应该是一个函数,因为实例从不隐式传递,而且它不能访问任何实例的成员。 不过,考虑到这一点,静态实际上不应该是函数吗? 我想确保我使用了正确的措辞。 有人能澄清一下吗?

  • 问题内容: 我在这里阅读Threadlocal的JavaDoc https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html 它说:“ ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。” 但是我的问题是,为什么他们选择使其静态化(通常)-使其具有“每个线程”状态

  • 本文向大家介绍接口变量在Java中默认为静态且为最终变量,为什么?,包括了接口变量在Java中默认为静态且为最终变量,为什么?的使用技巧和注意事项,需要的朋友参考一下 接口定义行为的协议,而不是行为的协议。实现接口的类遵守该接口定义的协议。 接口变量是静态的,因为无法单独实例化Java接口。必须在没有实例的静态上下文中分配变量的值。 final修饰符确保分配给接口变量的值是无法重新分配的真实常量。

  • 问题内容: 为什么默认情况下接口变量是静态变量和最终变量? 问题答案: 从Philip Shaw的Java接口设计常见问题解答中: 接口变量是静态的,因为无法单独实例化Java接口。必须在没有实例的静态上下文中分配变量的值。final修饰符确保分配给接口变量的值是一个真正的常量,不能由程序代码重新分配。