《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;  // 同一对象直接返回true
        if (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() 等方法的最佳实践。正确地实现这些方法,不仅能提升代码的质量、可维护性,还能避免在集合框架和其他使用对象的场景中出现问题。开发者应当根据这些最佳实践来设计和实现自己的类,确保代码的健壮性和可读性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国家统计局湖北调查总队副总队长张小青一行调研珈和科技农业遥感调查智能化算法

1月15日上午,国家统计局湖北调查总队党组成员、副总队长张小青一行莅临珈和科技开展调研。调研期间,张小青一行实地了解了珈和科技在自动化作物分布提取技术领域的最新成果,深入探讨了作物自动化处理模型在农业调查上应用的创新价值及优化方向…

2025-1-21 Newstar CTF web week1 wp

文章目录 week1headach3会赢吗智械危机 week1 headach3 根据提示,在页面的请求头里找到flag flag{You_Ar3_R3Ally_A_9ooD_d0ctor} 会赢吗 打开控制台,拿到第一部分flag 将地址栏改为提示,去到下一关 控制台调用函数,得到flag …

CPU狂飙900%如何分析?怎么定位?怎么溯源处理

当你的服务器CPU飙升到900%,系统卡顿、响应迟缓、业务受阻,这种令人焦虑的场景是否让你束手无策?别慌,这并不是世界末日,只要掌握正确的分析与定位方法,就能快速找到问题根源,并有效解决。 CPU…

leetcode919. 完全二叉树插入器,队列只保存右子树为空的节点

leetcode919. 完全二叉树插入器 完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。 设计一种算法,将一个新节点插入到一棵完全二叉树…

Mysql安装,mysql-installer-community-8.0.41.0

“windowR"键弹出运行框,输入”cmd"进入window命令提示符,输入“mysql -uroot -p"按下回车,再输入密码,按下回车,出现下面界面则是配置成功。 默认会在 C:\Program Files\MySQL\MySQL Server 8.0\bin …

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种:主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备,而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

1.21学习记录

misc 2023isctf 你说爱我尊嘟假嘟 这题有点脑洞,需要把你说爱我换成Ook.将尊嘟换为Ook!假嘟换成Ook?(根据语气进行猜测吧)用在线工具解密最后用base64解密即可 2023isctf 杰伦可是流量明星 解压后是一个MP3文件&am…

BaseCTF_Misc_week3

目录 broken.mp4 白丝上的flag 这是一个压缩包 纯鹿人 外星信号 我要吃火腿 Base Revenge broken.mp4 附件两个MP4文件,第一个可以播放,内容是视频受损的修复啥的。第二个破损了,那么就根据第一个视频的网页名称搜索找到相应的网页&…

Flutter项目和鸿蒙平台的通信

Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候, Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…

@TransactionEventListener的关键源码整理

前言:本篇文章不属于保姆级的,主要是方便自己回忆用的,所以需要阅读者具有一定的Spring源码基础。 总结: TransactionEventListener本质上还是EventListener,事件的发布还是Spring通用的那一套事件发布机制。EventLis…

StarRocks强大的实时数据分析

代码仓库:https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始:StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化…

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务(适用于小型应用)二. 使用调度框架…

蓝桥与力扣刷题(73 矩阵置零)

题目:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

源码分析之Openlayers中样式篇Text类

访问Openlayers网站(https://jinuss.github.io/Openlayers_map_pages/,网站是基于Vue3 Openlayers,里面有大量的实践和案例。觉得还不错,可以 给个小星星Star,鼓励一波 https://github.com/Jinuss/OpenlayersMap哦~ 概述 Text 类…

uniapp开发 swiper 上下滚动

一、效果图 二、代码: 在uni-app中使用swiper组件实现上下滚动(垂直滚动)的功能可以通过设置vertical属性来实现。swiper组件默认是水平滚动的,通过将vertical属性设置为true,可以改变滚动方向为垂直。 <template><view><swiper

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法&#xff0c;分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发&#xff0c;测试&#xff0c;生产等编译部署环境&#xff08;每一个环境…

异或和之和

题目&#xff1a; 0异或和之和 - 蓝桥云课 异或和之和 题目描述 给定一个数组 Ai​&#xff0c;分别求其每个子段的异或和&#xff0c;并求出它们的和。或者说&#xff0c;对于每组满足 1≤L≤R≤n 的 L,R&#xff0c;求出数组中第 L 至第 R 个元素的异或和。然后输出每组 …

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…