关于java:“如果你的团队成员用很多静态变量和静态方法编写代码,它会导致任何副作用吗?”

“If your team member writes code with lots of static variables and static methods, will it cause any side effects?”

本问题已经有最佳答案,请猛点这里访问。

这是我的面试问题。

"如果您的团队成员使用大量静态变量和静态方法编写代码,会产生任何副作用吗?"

有人能解释我吗?


这很大程度上取决于静态变量和方法的使用是否出于正确的原因。静态变量既可用于记录类的状态,也可用于与类关联的常量(如果声明为final)。

在我的经验中,静态方法通常是不需要访问类实例的实用方法,例如,生成实例的工厂方法。

看到这个


如果是多线程应用程序

静态会导致无效值的问题如果两个进程试图同时更改值

它可以通过同步来解决但它会使应用程序变慢


据我了解,面试官的问题不是"静态变量是个坏主意吗?"就其本身而言,是否会导致副作用。这是有区别的。严格地说,计算机科学中的"副作用"与"不良或意外的结果或副产品"并不完全相同(尽管人们有时——在我看来——错误地——用它来表示这一点)。

想想副作用的定义。从维基百科关于这个主题的文章:

In computer science, a function or expression is said to have a side
effect if it modifies some state or has an observable interaction with
calling functions or the outside world. For example, a particular
function might modify a global variable or static variable, modify one
of its arguments, raise an exception, write data to a display or file,
read data, or call other side-effecting functions. (Emphasis mine).

因此,基本上,副作用是对程序、全局或机器状态的某些方面的修改,这种修改持续存在于所讨论的方法调用之外。(例如,这与不影响或依赖全局状态的纯函数相反)。

因此,根据定义,拥有静态变量不会产生副作用——创建全局可变状态的行为是副作用。副作用本身并不是一件坏事;我们可以用计算机(如guis和数据库)做的很多有用的事情要么是(或涉及)副作用。公共静态变量的更大问题(也许这就是采访者所得到的)是它们基本上是全局变量,这被认为是有害的。

静态方法不太面向对象。如果你做了很多,你基本上就是在面向对象的系统上写命令式代码。尽管如此,静态方法肯定与产生副作用不同。静态方法可以是纯函数,就像与实例关联的方法一样。(尽管有很多静态方法仍然是一个糟糕的实践,即使它与有副作用的方法不同)。


这个问题太宽泛了。但我认为答案是肯定的。

静态代码有很多缺点,从紧密耦合到可能生成非线程安全的代码(例如共享可变对象)。

我建议坚持像Solid这样的最佳实践。如果您使用诸如Spring或GoogleGuice之类的依赖注入工具,还有一种简单的方法可以避免静态代码。


对于小项目来说没什么大不了的

当程序变大时

  • 发生内存泄漏的最大原因
  • 你的变量和其他变量在程序结束之前都是活动的
  • 数据损坏的最大可能性(因为每个变量和方法都由两个不同的线程访问)
  • 测试会很复杂
  • 非螺纹安全

你也应该读这个