为什么在 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 Animal
和 Dog extends Animal
。构造函数 public Animal(String species){...}
始终 return 是一个 Animal
对象。 Dog dog = Animal.fromSpecies(String species);
然而,是有效的。
当然有使用构造函数的理由,但就个人而言,我总是会为任何模糊复杂的事情选择静态工厂方法。
关于内存使用,除了在非常大项目或非常受限系统中,存储方法的成本可以忽略不计。加载时间是另一个问题,但不会通过避免静态方法得到改善。
我正在看 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
Animal
和Dog extends Animal
。构造函数public Animal(String species){...}
始终 return 是一个Animal
对象。Dog dog = Animal.fromSpecies(String species);
然而,是有效的。
当然有使用构造函数的理由,但就个人而言,我总是会为任何模糊复杂的事情选择静态工厂方法。
关于内存使用,除了在非常大项目或非常受限系统中,存储方法的成本可以忽略不计。加载时间是另一个问题,但不会通过避免静态方法得到改善。