Java &引用;如果您的团队成员使用大量静态变量和静态方法编写代码,是否会产生任何副作用?”;

Java &引用;如果您的团队成员使用大量静态变量和静态方法编写代码,是否会产生任何副作用?”;,java,static,Java,Static,这是我的面试问题 “如果您的团队成员使用大量静态变量和静态方法编写代码,是否会产生任何副作用?” 有人能解释一下吗?在多线程应用的情况下 静态会导致无效值的问题 如果两个进程试图同时更改值 可以使用synchronized解决这个问题 但这会使应用程序速度变慢对于小型程序来说,这并不是什么大问题 当程序变得更大的时候 发生内存泄漏的最大原因是 您的变量和其他变量将一直处于活动状态,直到程序结束 数据损坏的最大可能性(因为每个变量和方法都由两个不同的线程访问) 测试将是复杂的 非线程安全 你应

这是我的面试问题

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


有人能解释一下吗?

在多线程应用的情况下

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

可以使用synchronized解决这个问题
但这会使应用程序速度变慢

对于小型程序来说,这并不是什么大问题

当程序变得更大的时候

  • 发生内存泄漏的最大原因是
  • 您的变量和其他变量将一直处于活动状态,直到程序结束
  • 数据损坏的最大可能性(因为每个变量和方法都由两个不同的线程访问)
  • 测试将是复杂的
  • 非线程安全

你应该读这篇文章,这个问题太宽泛了。但我认为答案是肯定的

静态代码有很多缺点,从一开始就有可能生成非线程安全的代码(例如共享可变对象)


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

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

根据我的经验,静态方法通常是不需要访问类实例的实用方法,或者,例如,生成实例的工厂方法


据我对采访者的理解,问题不是“静态变量本身是个坏主意吗?”而是它们是否会导致副作用。这是不同的。严格地说,计算机科学中的“副作用”实际上与“不受欢迎或意外的结果或副产品”并不是一回事(尽管在我看来,人们有时会错误地用它来表示这一点)

考虑一下副作用的定义。从以下主题开始:

在计算机科学中,函数或表达式被称为有其一面 影响,如果它修改了某些状态或与 调用函数或外部世界。例如,一个特定的 函数可以修改全局变量或静态变量 在其参数中,引发异常,将数据写入显示器或文件, 读取数据,或调用其他影响函数。(我的重点)

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

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


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

这是一个糟糕的问题,没有证据表明之前的研究