Effective Java – 创建和销毁对象

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(266)   2023-12-05 16:34:57

创建和销毁对象(第 2 章)

这是 Joshua Bloch 的书 Effective Java 第 2 章的简短摘要。我只包含了与我自己相关的项目。

静态工厂(第 1 项)

静态工厂与构造函数的一些优点:

  • 工厂方法的名称为构造函数添加了描述
  • 他们可以返回预先构建的对象,而不是总是返回新的。
  • 它们可以返回已声明返回类型的任何子类型,甚至是非公共类。

使用静态工厂(例如使用私有构造函数)的主要缺点是该类不能被子类化。

构建器而不是具有许多参数的构造器(第 2 项)

调用带有许多参数的构造函数可能很麻烦,因为它需要查看方法声明以了解参数代表什么。这使得读取和调用这样的构造函数变得困难。

一种替代方法 是使用无参数构造函数构造一个对象,然后使用 setter 来设置所需的字段(JavaBean 模式)。这种方法的缺点是在设置不变量时对象可能处于不一致状态。此外,由于您提供的是 setter,因此对象是不可变的,这使得线程安全变得困难。

建筑商是两全其美的第二种选择。构建器首先以可读和紧凑的方式“收集”参数,然后通过首先验证不变量是否正确来实例化对象。

由于构建器对于小类来说可能有点矫枉过正,因此本书建议将其用于具有四个以上参数的类。请注意,构建器是构造函数和静态工厂的替代方案。

Singelton 的一些问题(第 3 项)

  • 如果单例未实现接口,单例将难以测试其客户端,因为您无法模拟单例。
  • 如果使单例可序列化,除非在反序列化时特别小心,否则它们不再是单例。
    • 实现单例的最佳方法是使用单元素枚举类型,这样可以避免序列化问题。

避免创建不必要的对象(第 5 项)

创建对象时应小心。重用昂贵的对象,但不要以防御性复制为代价(为了不可变性——第 39 条)。基元应优先于装箱基元,并在执行自动装箱时注意删除不必要的对象创建。

消除过时的对象引用(第 6 项)

这些书展示了一个堆栈示例,其中弹出项未从内部数组中清空,使它们成为无法被垃圾收集的过时引用。内存泄漏和过时引用的常见来源:

  • 每当一个类管理自己的内存时,程序员应该警惕内存泄漏。
  • 忘记缓存条目。考虑将 WeakHashMap 用于仅在存在对条目的外部引用时才保存项目的缓存。
  • Listeners回调 由于未注销。这里也可以使用 WeakHashMap
标签2: Java教程
地址:https://www.cundage.com/article/jcg-effective-java-creating-destroying-objects.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...