为什么在 Effective Java 中推荐使用静态方法?

Why using static methods is recommended in Effective Java?

我正在看 Effective Java(第 3 版,Joshua J. Bloch)

的第 1 章

并且它说使用静态方法比构造函数更好。

但我知道 static 在 classloader 启动时加载到内存中,

并且在正常情况下静态成员不会被垃圾收集器删除

直到 class 卸载。

因此,如果我理解正确,当我使用越来越多的 class 具有静态方法的系统时,

它占用更多内存,我说的对吗?

该内存是否值得关注,还是还有其他原因需要使用它们?

静态 成员变量 不会被垃圾回收(假设 classloader 仍然存在),因为 class 本身将始终持有对它。 methods.

也不一样

出于某些原因,有时首选静态方法(a.k.a 工厂方法)。

  • 您可以随意命名它们:想象一下以下构造函数:public Hyperlink(String string){...}。目前尚不清楚字符串实际指的是什么。是不是要把文字做成link?是 URL 吗?想象一下静态工厂 public Hyperlink.fromURL(String string){...}。清晰多了。

  • 缓存 - new关键字总是创建一个新对象,否则它会抛出异常。无法 return 某处缓存中已存在的对象。使用静态工厂,您可以首先检查对象是否不存在,如果存在则检索它,如果不存在则调用构造函数。

  • 多态性 - 考虑 classes AnimalDog extends Animal。构造函数 public Animal(String species){...} 始终 return 是一个 Animal 对象。 Dog dog = Animal.fromSpecies(String species); 然而,是有效的。

当然有使用构造函数的理由,但就个人而言,我总是会为任何模糊复杂的事情选择静态工厂方法。

关于内存使用,除了在非常大项目或非常受限系统中,存储方法的成本可以忽略不计。加载时间是另一个问题,但不会通过避免静态方法得到改善。