java - 为什么在 Effective Java 中推荐使用静态方法?
问题描述
我正在看Effective Java 的第 1 章(第 3 版,Joshua J. Bloch)
它说使用静态方法比构造函数更好。
但我知道当类加载器启动时静态加载到内存中,
并且在正常情况下,垃圾收集器不会删除静态成员
直到类卸载。
因此,如果我理解正确,当我使用越来越多的具有静态方法的类时,
它消耗更多内存,对吗?
那个记忆是害怕担心,还是有其他理由使用它们?
解决方案
静态成员变量不会被垃圾回收(假设类加载器仍然存在),因为类本身将始终持有对它的引用。方法也不一样。
出于一些原因,有时首选静态方法(又名工厂方法)。
您可以随意命名它们:想象一下以下构造函数:
public Hyperlink(String string){...}
. 目前尚不清楚该字符串实际指的是什么。是要加入链接的文字吗?是网址吗?想象一下静态工厂public Hyperlink.fromURL(String string){...}
。清晰得多。缓存 -
new
关键字总是创建一个新对象,或者它抛出一个异常。无法返回某个缓存中已经存在的对象。使用静态工厂,您可以首先检查对象是否不存在,如果存在则检索它,如果不存在则调用构造函数。多态性 - 考虑类
Animal
和Dog extends Animal
. 构造函数public Animal(String species){...}
总是返回一个Animal
对象。Dog dog = Animal.fromSpecies(String species);
但是,是有效的。
使用构造函数当然是有原因的,但就我个人而言,我总是会为任何复杂的事物选择静态工厂方法。
关于内存使用,存储方法的成本,除了在非常大的项目或非常受限的系统中是可以忽略不计的。加载时间是另一个问题,但不是通过避免使用静态方法来改进的。
推荐阅读
- sql - JPA 查询在 oracle 中运行失败,具体取决于值,出现 ORA-00600
- ios - 在 windows 上将 tensorflow 模型转换为 coreml 模型会出现问题
- gcc - 如何找到包含特定函数体的 obj 文件或库?
- python - Python Maya在形状编辑器/顶点索引中选择形状
- jquery - jquery prepend 添加了不需要的空间
- python - Arduino 到 Raspberry Pi SPI 接口通信
- vue.js - Vue Cli init my-app 引发“太多参数”
- list - 如何在 Scheme 中增加列表和矩阵?
- powershell - 存在强制参数时,PowerShell 报告无效错误行号
- python - 仅使用 IPython 时出现 ImportError