Effective Java笔记 :覆盖 equals 时请遵守通用约定

伯德图详解:从传递函数到系统稳定性的频域分析 在自动控制与控制系统设计中,理解系统对不同频率输入信号的响应特性,是分析和设计稳定系统的核心基础。频率响应描述了系统对正弦输入的幅值增益与相位变化规律,而伯德图作为最直观的频域分析工具,通过对数坐标将宽频带特性压缩成一条清晰曲线,让工程师无需复杂计算即可快速评估系统性能。从典型环节的渐近线绘制,到相位裕度、幅值裕度的读取,伯德图贯穿了系统稳定性判断、控制器参数整定及噪声抑制等关键场景。本文结合实际调试经验,系统讲解伯德图的绘制原理与读图方法,帮助读者快速掌握从传递函数到工程应用的核心技能。 阅读详情

Effective Java笔记 :覆盖 equals 时请遵守通用约定

在《Effective Java》中,Item 10:覆盖 equals 时请遵守通用约定 是一个重要的指导原则。equals 方法是 Java 对象中最核心的方法之一,正确地覆盖它不仅可以让程序运行更可靠,还能避免由于设计错误导致的潜在问题,例如违反对称性或一致性等。

下面我们会详细讲解覆盖 equals 方法的通用约定、注意事项、以及一个示例实现。


1. 为什么需要覆盖 equals 方法?

默认行为(Object 的 equals)

equals 方法在 java.lang.Object 中默认实现如下:

public boolean equals(Object obj) {
    return this == obj;  // 默认比较的是对象的引用
}

这一默认实现检查两个对象是否是同一个对象(内存地址是否相同)。这种行为对于大部分类(例如用作某种特定唯一身份对象)是足够的,但对于某些类,比如值类型类(value classes),通常需要比较它们的内容是否相同,而不是引用相等。

什么时候需要覆盖 equals?

当一个类需要通过值相等来判断两个对象是否相同时(而不是引用相等),就应该覆盖 equals。

比如:

  • String 类已经覆盖了 equals,比较内容而不是引用。
  • Integer 类也覆盖了 equals。

2. 通用约定(契约)

覆盖 equals 时,必须遵守以下约定,这些约定定义了 equals 的行为:

2.1 自反性(Reflexive)

  • 对任意非空引用值 x, x.equals(x) 必须返回 true。
  • 一个对象必须与自身相等。

2.2 对称性(Symmetric)

  • 对任意引用值 x 和 y,如果 x.equals(y) 返回 true,则 y.equals(x) 也必须返回 true。
  • 比较结果必须互相一致。

2.3 传递性(Transitive)

  • 对任意引用值 x、y 和 z,如果 x.equals(y) 为 true,且 y.equals(z) 为 true,那么 x.equals(z) 必须为 true。
  • 这保证了 equals 的一致性。

2.4 一致性(Consistent)

  • 对任意引用值 x 和 y,只要对象未改动,x.equals(y) 的比较结果就必须一致(无论调用几次都返回相同的值)。

2.5 对 null 的比较

  • 对任意非空引用值 x, x.equals(null) 必须返回 false。

3. 覆盖 equals 方法的注意事项

3.1 使用 instanceof 检查类型

  • 确保传入的对象类型是正确的,避免出现 ClassCastException。

3.2 比较每个字段的值

  • 对各个关键字段进行比较来判断对象是否相等。

3.3 返回 boolean 类型

  • 始终返回布尔值 true 或 false,而不是抛异常或者返回其他值。

3.4 避免对浮点数直接比较

  • 对于 float 和 double,在比较其值时要考虑精度问题;
  • 可以使用 Double.compare 或 Float.compare 方法。

4. 示例:一个正确覆盖 equals 的实现

假设我们有一个表示二维点的类 Point,需要覆盖 equals 方法。

public class Point {
    private final int x;
    private final int y;

    // 构造器
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // 覆盖 equals 方法
    @Override
    public boolean equals(Object obj) {
        // 1. instanceof 检查类型
        if (!(obj instanceof Point)) {
            return false; // 非同类型返回 false
        }
        
        // 2. 进行类型转换
        Point other = (Point) obj; 
        
        // 3. 比较关键字段
        return this.x == other.x && this.y == other.y; 
    }
    
    // 最好还要覆盖 hashCode 方法(后续会讨论)
    @Override
    public int hashCode() {
        return 31 * x + y; // 简单的哈希实现,确保一致性
    }
}

测试类:验证遵守约定

public class Main {
    public static void main(String[] args) {
        Point p1 = new Point(1, 2);
        Point p2 = new Point(1, 2);
        Point p3 = new Point(3, 4);

        // 自反性
        System.out.println("自反性: " + p1.equals(p1)); // true

        // 对称性
        System.out.println("对称性: " + p1.equals(p2)); // true
        System.out.println("对称性: " + p2.equals(p1)); // true

        // 传递性
        Point p4 = new Point(1, 2);
        System.out.println("传递性: " + p1.equals(p2)); // true
        System.out.println("传递性: " + p2.equals(p4)); // true
        System.out.println("传递性: " + p1.equals(p4)); // true

        // 一致性
        System.out.println("一致性: " + p1.equals(p3)); // false
        System.out.println("一致性: " + p1.equals(p3)); // false

        // 对 null 的检查
        System.out.println("null 检查: " + p1.equals(null)); // false
    }
}

输出:

自反性: true
对称性: true
对称性: true
传递性: true
传递性: true
传递性: true
一致性: false
一致性: false
null 检查: false

5. 需要同时覆盖 hashCode

约定:如果覆盖了 equals,必须同时覆盖 hashCode,并确保逻辑一致性。

equals 和 hashCode 的一致性要求:

  • 如果两个对象的 equals 方法返回 true,它们的 hashCode 方法也必须返回相同的值。
  • 如果两个对象的 equals 方法返回 false,它们的 hashCode 方法不强制要求不同。
为什么需要一致性?
  1. 在集合中使用(例如 HashMap、HashSet)时,hashCode 会影响哈希表的存储和查找行为。如果 equals 和 hashCode 不一致,集合可能出现较大的性能问题,甚至逻辑错误。
  2. equals 和 hashCode 共同确保对象的一致性。

6. equals 方法的设计建议

6.1 不要覆盖 equals(默认实现足够时)

如果类的实例不需要比较内容(即始终只需要比较引用),无需覆盖 equals,默认实现已经足够。

6.2 避免滥用 instanceof

如果对象应该实现严格的相等检查(包括类的子类比较),可以使用 getClass() 而不是 instanceof。

  • getClass() 是 java.lang.Object 中的方法,用于返回运行时对象的具体类(即实际类型)的 Class 实例。
  • 用 getClass() 检查类型时,它只会返回对象的声明类,不会考虑继承链。
  • 如果两个对象属于不同的具体类(即使其中一个是另一个的子类),getClass() 判断它们为不同类型。
  • instanceof 是一种用于检查一个对象是某个类或其子类的实例的运算符。使用 instanceof 时,会考虑继承关系,可以用来判断类的子类是否属于同一类型。
    这种行为更松散,因为它允许子类在类型检查时被认作父类。

示例:

@Override
public boolean equals(Object obj) {
    if (obj == null || obj.getClass() != getClass()) {
        return false;
    }
    // 自定义逻辑
}
6.3 谨慎处理浮点数比较

浮点数可能涉及精度问题,建议使用 Double.compare 或 Float.compare 方法。

7.子类新增比较字段的问题

如果你扩展了一个具体类(一个不是 abstract 的类),并且想在子类中引入新字段(值组件),则很难在保留这些约定的同时正确实现 equals。原因在于父类与子类之间的继承关系导致设计出了矛盾的逻辑。

具体举例:颜色点(Point 和 ColorPoint)问题

假设我们有一个简单的 Point 类,表示二维坐标系中的点。

父类 Point:
public class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Point)) {
            return false;
        }
        Point point = (Point) o;
        return x == point.x && y == point.y;
    }
}

Point 的 equals 方法比较其 x 和 y 坐标,判断两个点是否相等。

子类 ColorPoint:

现在我们扩展 Point 类,增加颜色字段:color。

public class ColorPoint extends Point {
    private final String color; // 新的值组件:颜色

    public ColorPoint(int x, int y, String color) {
        super(x, y);
        this.color = color;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof ColorPoint)) {
            return false;
        }
        ColorPoint that = (ColorPoint) o;
        return super.equals(o) && this.color.equals(that.color);
    }
}

出现的问题:打破 equals 的对称性

我们来看这个例子会发生什么:

public static void main(String[] args) {
    Point p = new Point(1, 2);
    ColorPoint cp = new ColorPoint(1, 2, "red");

    System.out.println(p.equals(cp));  // true (从 Point 的 perspective 只检查 x 和 y)
    System.out.println(cp.equals(p));  // false(从 ColorPoint 的 perspective 检查 x, y, color)
}

违反了对称性!

  • p.equals(cp) 返回 true,因为 Point 的 equals 实现只比较了 x 和 y,并不关心是否是 ColorPoint 的实例。
  • 但 cp.equals(p) 返回 false,因为 ColorPoint 的 equals 要求不仅 x 和 y 相同,还需要 color 相同(p 没有颜色数据)。

进一步问题:违反传递性

现在,我们再引入另一个颜色点:

ColorPoint cp_red = new ColorPoint(1, 2, "red");
ColorPoint cp_blue = new ColorPoint(1, 2, "blue");
Point p = new Point(1, 2);

如果按默认实现,这样的行为会违反传递性:

System.out.println(cp_red.equals(p)); // true (ColorPoint 和 Point 只比较 x 和 y)
System.out.println(p.equals(cp_blue)); // true (Point 和 ColorPoint 也只比较 x 和 y)
System.out.println(cp_red.equals(cp_blue)); // false (ColorPoint 额外比较 color)

违反了传递性:

  • cp_red.equals(p) 返回 true
  • p.equals(cp_blue) 返回 true
  • 但 cp_red.equals(cp_blue) 返回 false

** 为什么无法解决这个问题?**

这个问题的根本原因是继承 Point 和 ColorPoint 之间对 equals 的要求不可兼容:

  1. Point 的 equals 定义只比较 x 和 y。
  2. ColorPoint 的 equals 不仅要比较 x 和 y,还要比较 color。

在继承关系中,子类通常需要扩展父类,而不是减少功能。然而,equals 的传递性要求比较的逻辑必须是固定的,不能根据子类的扩展而改变。

总之,这种扩展导致逻辑矛盾:

  • 如果 Point.equals 忽略 color,它会打破对称性。
  • 如果 ColorPoint.equals 强制要求所有对象都包含 color,就和父类逻辑不兼容。

如何应对这个问题?
方案 1:限制继承(违反里氏替换原则)

最简单的办法是,不允许子类为 Point 添加新的值组件。换言之:

  • 如果设计了一个支持 equals 方法的类(比如 Point),让这个类不允许被继承。

可以通过将 Point 声明为 final 来避免继承。

public final class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Point)) {
            return false;
        }
        Point point = (Point) o;
        return x == point.x && y == point.y;
    }
}

如果 Point 是不可扩展的,类的等价性逻辑也会变得清晰:它永远只需要比较 x 和 y。


方案 2:使用组合而不是继承

另一种解决方法是,避免直接继承,而通过组合来表达扩展的需求。

public class ColorPoint {
    private final Point point; // 组合关系
    private final String color;

    public ColorPoint(int x, int y, String color) {
        this.point = new Point(x, y);
        this.color = color;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof ColorPoint)) {
            return false;
        }
        ColorPoint cp = (ColorPoint) o;
        return point.equals(cp.point) && color.equals(cp.color);
    }

    @Override
    public int hashCode() {
        return point.hashCode() * 31 + color.hashCode();
    }
}

通过组合,ColorPoint 的等价性检查不再打破 Point 的逻辑,因为 Point 的等价逻辑与子类(ColorPoint)之间没有直接耦合关系。


方案 3:用不同类型的方式比较

如果确实需要支持父类和子类之间带值组件的比较,可以提供额外的比较逻辑(如提供一个自定义比较器),而不是直接扩展 equals 方法。


8. equals 的测试工具

  1. JUnit:
    使用 JUnit 可以对 equals 方法进行系统性测试。
  2. Apache Commons EqualsBuilder:
    Apache Commons Lang 提供了一个 EqualsBuilder 工具类,可以快速实现 equals 方法。
深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略 本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。 阅读详情

相关推荐

5G边缘计算:核心网下沉革命

5G核心网与边缘计算的深度融合,通过UPF下沉、本地流量卸载等关键技术,实现了低时延、高效能的分布式计算架构。该技术将数据处理从核心网向边缘节点转移,支持工业控制、车联网、远程医疗等场景的1-10ms超低时延需求。5G核心网的SBA架构和CUPS设计为边缘计算提供了灵活部署基础,SMF、PCF等网元协同确保业务质量与可靠性。

Qinti_mm的博客 1402

Java:Effective java学习笔记之 覆盖equals时请遵守通用约定

Java覆盖equals时请遵守通用约定覆盖equals时请遵守通用约定1、为什么要覆盖equals2、需要覆盖equals方法的时机2.1、不需要覆盖equals方法的情况2.2、需要覆盖equals方法的情况2.2.1、自反性2.2.2、对称性2.2.3、传递性2.2.4、一致性2.2.5、非空性3、高质量equals方法的几个注意点3.1、规范案例4、除了上述的注意点之外,下面给出一些整体的告诫:4.1、==和equals()的区别5、总结参考 覆盖equals时请遵守通用约定 1、为什么要覆盖equ

JMW1407的博客 600

鸿蒙【ArkTS】使用TS装饰器封装网络请求HTTP

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的@ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。这里采用TS的装饰器实现AOP效果 完成前后端接口风格的统一

weixin_60376559的博客 5611

读《Effective Java》笔记之 第八条:覆盖equals时请遵守通用约定

不应覆盖equals的情况 equals方法有许多覆盖方式都会导致错误,避免这种错误最简单的办法就是不覆盖equals方法。以下几种情况适合不去覆盖equals 类的每个实例本质上都是唯一的 不需要“逻辑相等”的概念 超类已经覆盖了equals,从超类继承过来的行为对子类也是合适的 类是私有或包级私有的,可以确定它的equals方法永远不会被调用;不过这种情况,显然应该覆盖equals方...

myco前的专栏 356

Cursor锁机了怎么办?实测这个开源插件帮你无限“续杯”,附详细安装与防踩坑指南

本文提供了Cursor锁机问题的详细解决方案,包括使用开源插件`cursor-fake-machine`修改机器标识、锁定配置文件权限以及优化使用规范。同时介绍了如何利用Cursor开发油猴脚本将微信公众号文章高效转换为Markdown格式,提升内容创作效率。

weixin_26805597的博客 767

MaixCAM2 4K AI相机硬件解析与开发实战

嵌入式AI视觉开发中,边缘计算设备的选择直接影响项目落地效果。以NPU为核心的AI加速技术通过专用指令集优化,可在低功耗下实现10+TOPS算力,典型应用包括工业质检、智能门禁等实时场景。MaixCAM2作为新一代4K AI相机,搭载AX630 SoC芯片,其双核Cortex-A53与NPU的异构架构,在运行YOLOv11n模型时可达113FPS,显著优于传统方案。开发时需注意模型量化部署技巧,如INT8量化需500+张校准图片覆盖多光照条件,避免准确率下降。设备扩展性方面,PMOD接口支持热成像、ToF传

weixin_30819085的博客 691

【Effective Java笔记】第8条:覆盖equals时请遵守通用约定

反反复复看了几遍,感觉第八条写的真心好,虽然平时知道怎么重写equals吧,但根本不会去想这么多,各种固定思维。不过现在对equals的重写又有新的认识了,下面就写关于第八条覆盖equals时请遵守通用约定的阅读笔记吧 该篇博客主要阐述 1、不需要覆盖equals的情景 2、需要覆盖equals的情景 3、对5条通用约定的理解 4、实现高质量equals的诀窍...

浅然的专栏 1333

MaxEnt物种分布预测中的常见误区与优化技巧:如何提高模型准确率

本文深入探讨了MaxEnt物种分布预测模型从基础应用到精准预测的进阶实践。针对模型准确率提升,文章系统分析了环境变量筛选、模型参数调优、结果批判性解读等核心环节的常见误区,并提供了基于生态位模型原理的深度优化技巧,帮助研究者产出更可靠、可解释的预测结果。

weixin_29219539的博客 594

读书笔记-《Effective Java》第8条:覆盖equals时请遵守通用约定

如果覆盖equals方法的目的是判断对象之间是否相等,那么使用超类(Object)的方法即可。 public boolean equals(Object obj) { return (this == obj); } 在覆盖equals方法的时候,必须要遵守它的通用约定: 自反性(reflexive)。对于任何非null的引用值x,x.equals(x)必须返回tr...

baitianmingdebai的专栏 219

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程BACnet MS/TP BACnet IP调试说明

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程mstp,bacnet ip调试说明

shufawangzhang的博客 2222

12、无人机系统的建模与仿真

本文深入探讨了无人机系统的建模与仿真技术,涵盖其发展需求、历史演变、动力学建模方法、常用参考框架与状态变量表示,并分析了在控制系统设计、操作员培训和子系统测试中的关键应用。文章还介绍了不同类型无人机(固定翼、旋翼、混合翼)在建模与仿真中的差异,提出了多学科融合、高精度实时仿真及VR/AR技术等未来发展趋势,并给出了实际建模与仿真的标准操作流程,为无人机系统的设计与优化提供了全面的技术支持与展望。

websocket5live的博客 196

覆盖equals时请遵守通用约定 《Effective Java》第三章第十条

关于 《Effective Java》第三章第十条:覆盖equals时请遵守通用约定 的学习

qq_47129343的博客 804

生产环境中redis的SCAN命令如何替代KEYS命令?

本文介绍了使用SCAN命令替代KEYS的完整方案。SCAN通过游标分批迭代,避免KEYS命令遍历整个键空间导致的阻塞风险。文章详细说明了SCAN的基础语法、迭代流程和Java实现示例,强调必须关闭Cursor避免连接泄漏。针对生产环境,提供了COUNT参数调优、客户端去重、集群模式适配等优化建议,并列举了典型错误场景。SCAN通过分批次迭代和游标管理,可安全实现高性能键空间遍历。全文150字。

DN金猿的博客 179

Effective Java 对于所用对象都通用的方法 8.覆盖equals时请遵守通用约定.txt

对于eclipse覆盖equals方法就是Alt+Shift+S,而AS就是Alt+Insert。覆盖很简单,可是却容易导致错误,而且后果很严重。最容易避免的方法就是不覆盖,这样类就只与他自身相等。 如果满足了以下任何一个条件,那么覆盖equals就能达到期望了。 1、类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Obj

yancyang的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Effective java 覆盖equals时请遵守通用约定

该篇博客主要阐述 1、不需要覆盖equals的情景 2、需要覆盖equals的情景 3、对5条通用约定的理解 4、实现高质量equals的诀窍 5、注意点 一、不需要覆盖equals的情景 1、类的每个实例本质上都是唯一的 对于代表活动实体而不是值(value)的类来说确实如此,比如Thread 2、不关心类是否提供了“逻辑相等”的测试功能 书本上的例子是java.util.Random覆盖equals,以检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户需要或者期望这样的功能。在这种

菜园子丶For丨丶Tomorrow的博客 165

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《Effective Java》解读第10条:覆盖equals时请遵守通用约定

本文介绍了覆盖equals方法时应遵循的通用约定。在大多数情况下无需重写equals,但当类需要"逻辑相等"概念(如值类)时则需要覆盖。覆盖时必须满足五个特性:自反性、对称性、传递性、一致性和非空性。实现高质量equals方法的技巧包括:使用==检查自引用、instanceof验证类型、逐字段比较等,同时要注意处理null值和特殊类型。最后强调覆盖equals时必须同时覆盖hashCode,避免过度设计,并建议使用IDE工具生成后测试。

Cosmoshhhyyy的博客 935

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Effective Java笔记(10)覆盖 equals 时请遵守通用约定

如果类实现的接口改进了 equals 约定,允许在实现了该接口的类之间进行比较,那么就使用接口。如果覆盖 equals ,一定要比较这个类的所有关键域,并且查看它们是否遵守 equals 合约的所有五个条款。例如,大多数的Set 实现都从Abstract Set 继承 equals 实现,List 实现从 AbstractList 继承 equals 实现,Map 实现从 AbstractMap 继承 equals 实现。如果该类型是个类,也许就能够直接访问参数中的域,这要取决于它们 的可访问性。

琅琊之榜 450

跟我学(Effective Java 2)第8条:覆盖equals时请遵守通用约定

第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有很多覆盖方式会导致错误,并且后果非常的严重。最容易避免这类问题的办法就是补覆盖equals方法,在这种情况下,类的每个实例都只是与它自身相等。如果满足以下任何一个条件,这正是所期望的结果: 1 类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说,例如Thread。Object提供的equ...

Dullon_jiang的博客 287

《Effective Java》阅读笔记8 覆盖equals方法请遵守通用约定

1.序 2.不需要覆盖equals的情景 类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Object提供的equals实现对于这些类来说正是正确的行为。 不关心类是否提供了“逻辑相等(logical equality)”的测试功能。例如,java.util.Random覆盖了equals,以检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户需要或者期望这样的功能。在这样的情况下,从Object继承得到的equals实现已经足

weixin_41563161的博客 353

《Effective Java》读书笔记——覆盖equals时请遵守通用约定

equals()方法是Object类的方法,而Object是所有类的顶级父类,所有的类都会拥有Object的方法,也会拥有equals()方法。在Object类中,equals()方法的实现特别简单,比较的两个实例为同一个实例则相等。

J_Killer 499

Effective Java -- 对于所有对象都通用的方法 -- 覆盖equals时请遵守通用约定

第三章 对于所有对象都通用的方法 第十条 覆盖equals时请遵守通用约定 不要轻易覆盖 equals 方法,除非迫不得已。 如果覆盖 equals 方法,一定要比较所有关键域,并查看它们是否遵守合约的五个条款。

weixin_43164759的博客 195

Effective Java笔记第二章对所有对象都通用的方法第一节覆盖equals时请遵守通用约定

Effective Java笔记第二章对所有对象都通用的方法 第一节覆盖equals时请遵守通用约定 1.最容易避免覆盖equals方法错误的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只会与它自身相等,满足以下任何一个条件都不需要覆盖equals方法: 1)类的每个实例本质上都是唯一的:对于代表活动实体而不是值的类来说就是这样。 2)不关心类是否提供了"逻辑相等"的测试功能。 3)超类(被继承的类)已经覆盖了equals,从超类继承过来的行为对于子类也是适合的。 ...

zh123456_789的博客 217

Effective Java - 对于所有对象都通用的方法 - 覆盖 equals 时请遵守通用约定

读书笔记 仅供参考不覆盖 equals 方法许多覆盖方式会导致错误,并且后果十分严重,最容易避免错误的方法就是不覆盖 equals 方法。每个类的实例都只与自身相等。 类的每个实例本质上都是唯一的 不关心类是否提供了“逻辑相等”的功能 超类已经覆盖了 equals,从超类继承过来的行为对子类也是合适的(例如 List 从 AbstractList 继承 equals) 如果类是私有的或包级私有,可以

wujunyucg的博客 241

Effective Java之覆盖equal时要遵守通用约定(八)

终结方法的缺点1.终结方法不能保证及时执行,因此注重时间的任务不应该由终结方法来完成。例如:用终结方法去关闭已经打开的文件,这是一种严重错误,因为打开文件描述符是一种很有限的资源,如果jvm延迟终结方法,导致多个文件处于打开的状态。2.终结方法不能保证一定会被执行。如果企图通过终结方法释放共享资源上的永久锁,会使整个分布式系统挂掉。3.不要被System.gc和System.runFinalizat

heihei 542

Effective Java 【对于所有对象都通用的方法】第10条 覆盖equals方法请遵守通用规范

覆盖equals方法请遵守通用规范 尽管Object是一个具体类,但是设计它主要是为了扩展,它所有的非final方法(equals、hashCode、toString、clone、finalize)都有明确的通用约定,因为它们设计成是可覆盖的(override),任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用约定,如果不能做到这点,其他依赖于这些约定的类(例如:HashMap和HashSet)就无法结合该类一起正常运作。 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果

zhangxiaoxiao9527的博客 251

Effective Java 第八条:覆盖equals请遵守通用约定

首先介绍一下Java中equals通用约定,分别是:自反性、对称性、一致性、传递性。 检查自反性的通用方法: 将对象扔到List里,然后看List.contains()是否返回true。 首先来看一个违反对称性的例子: public class CaseInsesitiveString { private final String s; public Ca

生活不只眼前的苟且,还有诗和远方的田野。 583
上一篇: Effective Java笔记:优先考虑依赖注入来引用资源
下一篇: Effective Java笔记:谨慎地覆盖 clone
Jooou
博客等级 码龄9年 226粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值