《Effective Java》学习笔记——第2部分 对象通用方法最佳实践

文章目录

    • 第2部分 所有对象通用方法
      • 一、前言
      • 二、最佳实践内容
        • 1. equals()方法
        • 2. hashCode()方法
        • 3. toString() 方法
        • 4. clone() 方法
        • 5. finalize() 方法
        • 6. compareTo()方法(实现 Comparable 接口)
      • 三、小结


image-20250121180822049

第2部分 所有对象通用方法

一、前言

《Effective Java》共有多个章节,每个章节提供了若干条建议或最佳实践,整理了对应章节关键的实践内容,用于自己后续代码开发过程中,参考对照,自查代码习惯,从而提升输出的代码质量。

二、最佳实践内容

如何实现和使用 Java 中的基本方法,包括 equals()hashCode()toString()clone() 等。这些方法通常是 Java 对象中必须实现的通用方法,影响着对象的行为,尤其是在集合框架等使用对象的场景中,正确实现这些方法至关重要。

1. equals()方法
  • 目的equals() 方法用于比较两个对象是否相等。在 Java 中,所有的对象默认继承自 Object 类,而 Object 类提供了一个 equals() 方法(默认比较对象的内存地址)。但是,很多时候我们需要根据对象的属性值来判断两个对象是否相等,因此我们需要重写这个方法。

  • 最佳实践:

    • 必须确保遵循 对称性自反性传递性一致性 四个原则。
    • 使用 instanceof 检查对象类型,并强制转换对象。
    • 推荐使用 Objects.equals() 进行 null 安全比较。
  • 示例

    java复制编辑
    @Override
    public boolean equals(Object o) {if (this == o) return true;  // 同一对象直接返回trueif (o == null || getClass() != o.getClass()) return false;  // 类型检查MyClass that = (MyClass) o;return Objects.equals(this.field, that.field);  // 比较字段
    }
    
2. hashCode()方法
  • 目的hashCode() 方法返回对象的哈希码,它与 equals() 方法紧密相关。若两个对象通过 equals() 方法比较是相等的,它们的哈希码也必须相等。因此,重写 equals() 时必须重写 hashCode()

  • 最佳实践:

    • 如果两个对象通过 equals() 方法比较是相等的,则它们的 hashCode() 必须相等。
    • hashCode() 方法应尽可能均匀分布,避免哈希冲突。
    • 推荐使用 Objects.hash() 来简化哈希码的计算。
  • 示例:

    @Override
    public int hashCode() {return Objects.hash(field);
    }
    
3. toString() 方法
  • 目的toString() 方法返回对象的字符串表示形式。默认的 toString() 方法返回的是对象的类名加上对象的内存地址,但通常我们需要一个更具描述性的字符串表示,特别是在调试时。

  • 最佳实践:

    • 重写 toString() 方法,使其返回有意义的字符串,便于调试和日志记录。
    • 可以使用 StringBuilder 来拼接字符串。
  • 示例:

    @Override
    public String toString() {return "MyClass{field=" + field + "}";
    }
    
4. clone() 方法
  • 目的clone() 方法用于创建当前对象的副本。默认情况下,Object 类提供的 clone() 方法执行的是 浅拷贝,即只复制对象的基本类型字段或对其他对象的引用。如果对象包含引用类型字段,通常需要自定义 clone() 方法来执行深拷贝。

  • 最佳实践:

    • 如果需要支持克隆功能,确保类实现 Cloneable 接口。
    • 深拷贝:如果对象包含引用类型字段,需要在 clone() 方法中手动处理字段的深拷贝。
    • 抛出 CloneNotSupportedException:当不希望对象被克隆时,抛出此异常。
  • 示例:

    @Override
    public Object clone() throws CloneNotSupportedException {MyClass cloned = (MyClass) super.clone();cloned.field = new Field(this.field);  // 深拷贝字段return cloned;
    }
    
5. finalize() 方法
  • 目的finalize() 方法是 Java 中的一个特殊方法,用于对象即将被垃圾回收时进行资源清理。通常它用于清理文件句柄、数据库连接等外部资源。

  • 问题:

    • finalize() 方法的不确定性:垃圾回收的时间不可预测,因此不能依赖它来释放资源。
    • 不推荐在类中实现 finalize(),因为它可能会带来性能问题或资源泄漏。
  • 最佳实践:

    • 使用 try-with-resources 代替 finalize() 来管理资源。
    • 对于管理外部资源的类,应该显式提供一个 close() 方法来释放资源,而不是依赖 finalize()
  • 示例:

    @Override
    protected void finalize() throws Throwable {try {// 执行清理操作} finally {super.finalize();}
    }
    
6. compareTo()方法(实现 Comparable 接口)
  • 目的compareTo() 方法用于对象之间的比较,通常用于排序等场景。它实现了 Comparable 接口,该接口要求实现一个 compareTo() 方法来定义对象的排序规则。

  • 最佳实践:

    • 实现 compareTo() 方法时,确保它遵循 对称性传递性一致性
    • 如果类支持排序,建议使用 Comparator 接口来扩展排序规则。
  • 示例:

    @Override
    public int compareTo(MyClass other) {return Integer.compare(this.field, other.field);  // 按字段排序
    }
    

三、小结

《Effective Java》第2部分强调了 Java 中对象的通用方法,涵盖了 equals()hashCode()toString()clone()finalize()compareTo() 等方法的最佳实践。正确地实现这些方法,不仅能提升代码的质量、可维护性,还能避免在集合框架和其他使用对象的场景中出现问题。开发者应当根据这些最佳实践来设计和实现自己的类,确保代码的健壮性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5198.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!

引言 时光飞逝,2024年已经来临,回顾过去一年,科技的迅猛进步简直让人目不暇接。 在人工智能(AI)越来越强大的今天,我们不再停留在幻想阶段,量子计算的雏形开始展示它的无穷潜力,Web …

图的基本概念

一、图 二、顶点的度 三、图的同构 ​​​​​​​​​​​ 四、完全图 五、子图 六、补图

【游戏设计原理】75 - 最小最大化

一、理解与分析 最小/最大化的核心是玩家在角色扮演类游戏中使用的一种策略,旨在通过把角色的某些不利特性最小化、而有利特性最大化来增强角色在特定领域的优势。这种策略通常表现为以下几种形式: 角色单一化:玩家通过极端优化角色的某一项…

【K8S系列】K8s 领域深度剖析:年度技术、工具与实战总结

引言 Kubernetes作为容器编排领域的行业标准,在过去一年里持续进化,深刻推动着云原生应用开发与部署模式的革新。本文我将深入总结在使用K8s特定技术领域的进展,分享在过去一年中相关技术工具及平台的使用体会,并展示基于K8s的技术…

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

1.环境搭建 硬件环境:CANoe、待测设备(包含UDS诊断模块) 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…

mybatis(19/134)

大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符&#xf…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)

本文验证基于请求头中传递token信息的认证方式,webapi项目的控制器类中新建如下函数,仅通过验证的客户端能调用,需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…

Linux:进程(三)

1. 进程创建补充 fork之后父子两个执行流分别执行,fork之后谁谁先执行由调度器来决定。 一般,父子代码共享。当父子不再写入时,数据也是共享的,但是当有一方要写入,就触发写时拷贝。 fork调用失败的原因 1. 系统中有…

一、vue智能Ai对话(高仿通义千问)普通版。

如需源码&#xff1a;请私信。 普通版视频地址&#xff1a;普通版视频 流式进阶版视频地址&#xff1a;流式进阶版视频 流式进阶版&#xff1a;流式进阶版源码 html结构和js方法&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta …

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

【winRAR】windows11右键直接打开winRAR

总览 目前能够完成的操作不能像 win10 那样全面&#xff0c;需要做一些取舍&#xff0c;这两种解决后的样子任选其一&#xff1a; 1.右键之后&#xff0c;直接显示 “解压到当前文件夹” 2.右键之后&#xff0c;直接出现 winRAR 的母菜单&#xff0c;在鼠标 hover 到上面的时…

云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?

引言 在近日举办的一场「云和恩墨大讲堂」直播栏目中&#xff0c;云和恩墨联合创始人李轶楠、副总经理熊军和欧冶云商数据库首席薛晓刚共同探讨了DBA的现状与未来发展。三位专家从云计算、人工智能、国产化替代等多个角度进行了深入的分析和探讨&#xff0c;为从业者提供了宝贵…

STM32 FreeRTOS 任务挂起和恢复---实验

实验目标 学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用&#xff1a; start_task:用来创建其他的三个任务。 task1&#xff1a;实现LED1每500ms闪烁一次。 task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键按下逻辑&#xff0c;KE…

2025年PHP面试宝典,技术总结。

面试是进入职场的第一道坎&#xff0c;因为我本身学校太一般的问题在面试中遇到了各种不爽&#xff0c;和那些高学历的相比自己真是信心大跌。我面试的方向是php开发工程师&#xff0c;主要做网站后台、APP接口等。下面是我这段时间总结的面试方面的常考常问的知识点&#xff0…

Python运算符

1、算术运算符 加 减— 乘* 除/ 整除// 取余% 幂运算** 优先级&#xff1a; 第1级&#xff1a;** 第2级&#xff1a;* &#xff0c; / &#xff0c; % &#xff0c;// 第3级&#xff1b; &#xff0c; - print("加", 1 4) print("减",8 - 19) p…

RTMP|RTSP播放器只解码视频关键帧功能探讨

技术背景 我们在做RTMP|RTSP直播播放器的时候&#xff0c;遇到过这样的技术诉求&#xff0c;在一些特定的应用场景中&#xff0c;可能只需要关键帧的信息&#xff0c;例如视频内容分析系统&#xff0c;可能只对关键帧进行分析&#xff0c;以提取特征、检测对象或场景变化。鉴于…

2024年度总结-CSDN

2024年CSDN年度总结 Author&#xff1a;OnceDay Date&#xff1a;2025年1月21日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 文章目录 2024年CSDN年度总结1. 整体回顾2…

【Node.js]

一、概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 &#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c; 让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 官网地…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面&#xff0c;包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF&#xff08;高频&#xff09; 或 UHF&#xff08;超高频&#xff09; 波段的无线通信协议&#xff0c;主要用于军事通信系统中。为了…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中&#xff0c;网络请求是常见且致其重要的功能之一。从获取资料到上传数据&#xff0c;出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架&#xff0c;提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…