为什么知道这个后,我再也不用static了?|JavaD

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:为什么知道这个后,我再也不用static了?

我是一个刚入门的Java程序员。最近我用Groovy和Java开发了一个应用程序。我所写的所有代码都使用了相当多的static关键字。我被高级技术人员要求减少使用的static的数量。我在谷歌上搜索了一下,发现许多程序员相当反对使用static变量。
我发现静态变量使用起来更方便。我觉得他们是非常高效的(如果我错了请纠正我),因为如果我必须在1个类中调用10000个方法,我很高兴能让直接使用静态的方法,并通过Class.methodCall()的形式简单调用,而非充斥着10000类的实例,对吧?
此外,使用static减少了对代码其他部分的相互依赖。他们可以作为完美的状态持有者。除此之外,我发现static在一些语言中得到了广泛的实现,比如Smalltalk和Scala。那么,为什么这种对static的烦恼在程序员中如此普遍(尤其是在Java世界中)呢?
PS:如果我对static的设想是错误的,请纠正我。

回答一

static变量表示全局状态。这很难推导,也很难测试:如果我创建一个对象的新实例,我可以在测试中推理它的新状态。如果我使用使用静态变量的代码,它可以处于任何状态-任何东西都可以修改它。
我可以继续讲很长一段时间,但更大的概念是,某物的范围越窄,就越容易推理。我们擅长思考小事情,但如果没有模块化,就很难推理出100万条线路系统的状态。顺便说一下,这适用于所有的东西,不仅仅是静态变量。

回答二

static有害的是非常主观的。

你不能控制静态对象的创建和销毁。它们活在程序的加载和销毁命令下。
由于静态对象保存在一个类空间中,所有希望使用它们的线程都必须通过访问控制。这意味着程序是非常耦合的,一旦静态对象改变是很难想象和管理的。这会影响代码块之间的隔离性并且影响测试的方式。

这是我认为存在的两个主要问题。

回答三

总结在Java中使用静态方法的几个基本优点和缺点:

优点

  1. 全局可访问,不与任何特定对象实例绑定
  2. 每个JVM一个实例
  3. 可以使用类名访问(不需要对象)
  4. 包含一个适用于所有实例的值
  5. JVM启动时加载,JVM关闭时停止
  6. 它们不会修改对象的状态

缺点

  1. 静态成员无论是否在使用中,都始终是内存的一部分
  2. 无法控制静态变量的创建和销毁,它们在程序加载时创建,在JVM关闭时被销毁
  3. 线程不安全是如果一个线程更改了静态变量的值,可能会破坏其它线程的功能
  4. 必须先知道对象是静态的,才能使用它
  5. 无法覆盖静态方法
  6. 序列化对它们不起作用
  7. 它们不参与运行时多态
  8. 如果使用大量静态变量/方法,则存在内存问题,因为程序结束之前不会被垃圾回收
  9. 静态方法也很难测试

文章翻译自Stack Overflow:stackoverflow.com/questions/7…