首页 > 解决方案 > 为什么在 Effective Java 中推荐使用静态方法?

问题描述

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

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

但我知道当类加载器启动时静态加载到内存中,

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

直到类卸载。

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

它消耗更多内存,对吗?

那个记忆是害怕担心,还是有其他理由使用它们?

标签: javastaticgarbage-collection

解决方案


静态成员变量不会被垃圾回收(假设类加载器仍然存在),因为类本身将始终持有对它的引用。方法也不一样。

出于一些原因,有时首选静态方法(又名工厂方法)。

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

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

  • 多态性 - 考虑类AnimalDog extends Animal. 构造函数public Animal(String species){...}总是返回一个Animal对象。Dog dog = Animal.fromSpecies(String species);但是,是有效的。

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

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


推荐阅读