首页 > 编程语言 >《Effective Java》阅读笔记-第三章

《Effective Java》阅读笔记-第三章

时间:2023-11-29 14:11:43浏览次数:31  
标签:第三章 Effective true 方法 clone equals compareTo Java 重写

Effective Java 阅读笔记

第三章 对于所有对象都通用的方法

第 10 条 重写 equals 时请遵守通用约定

重写 equals 方法很简单,但是很容易出现错误,最直接避免这种错误的方式就是不重写 equals,
当出现任意一下情况的时候,就不需要重写 equals:

  • 类的每个实例在逻辑上就是唯一的
  • 没比要提供“逻辑相等”功能的
  • 父类的 equals 方法对子类也适用时
  • 私有类,并且确定 equals 方法不会被调用

上述任一情况就可以不重写 equals 方法。

如果需要提供 equals 方法,那应该遵循一下约定:

  • 自反性(reflexive):x 不为 null 时,x.equals(x)应当返回 true
  • 对称性(symmetric):x、y 不为 null 时,如果x.equals(y)为 true,那么y.equals(x)也必须为 true
  • 传递性(transitive):x、y、z 不为 null 时,如果x.equals(y) && y.equals(z)为 true,那么x.equals(z)也必须为 true
  • 一致性(consistent):如果x.equals(y),并且x、y的值都没有修改,那么x.equals(y)应始终为 true
  • 任何非 null 的引用x,x.equals(null)必须为 false

其他告诫:

  • 重写 equals 时同时重写 hashCode 方法
  • 不要让 equals 的实现过于繁重
  • 不要修改 equals 参数的类型,也就是不要修改 Object 为具体的类

第 11 条 重写 equals 时必须重写 hashCode 方法

如果不重写 hashCode 方法,会导致 HashMap、HashSet等类无法正常运作。

下面是 Object 的规范:

  • 如果对象没有改变,那么 HashCode对象的返回值应该是相同的
  • 如果两个对象使用 equals 比较时相等了,那么 hashCode 方法必须返回相同的值
  • 如果两个对象使用 equals 比较时不相等,那么 hashCode 方法返回值没有要求

第 12 条 尽量重写 toString 方法

可以方便 debug 等

第 13 条 谨慎重写 clone 方法

clone 方法在 Object 类上是 protected,实现了 Cloneable 接口的类并不一定具有能调用的 clone 方法.

Cloneable 接口只是标记该类可以被 clone,并且重写 clone 方法需要做的事情并不少,不仅需要逐一 clone 内部的引用类型,还需要调用 super.clone(),反正谨慎使用 clone 方法。

第 14 条 可比较对象可以实现 Comparable 接口

Comparable 接口中有一个返回值为 int 类型的单个方法:

public interface Comparable<T> {
    public int compareTo(T o);
}

当前对象大于、等于、小于被比较的对象时,分别返回正数、0、负数。

实现接口时,有几点需要注意的:
由于 compareTo 方法只看正负,不看具体值,因此这里使用Math.signum()来表示

  • 实现必须保证signum(x.compareTo(y)) == -signum(y.compareTo(x)),即 x 向 y 比较,和 y 向 x 比较的意义是相同的。
  • 比较关系必须可传递,即当x.compareTo(y) && y.compareTo(z)为 true 时,那么x.compareTo(z)也一定为 true
  • 比较关系必须等价,即当x.compareTo(y) == 0时,那么任意 z 有:signum(x.compareTo(z)) == signum(y.compareTo(z))
  • 强烈建议(x.compareTo(y) == 0) == (x.equals(y)),但是并非绝对必要,此时需要说明排序与 equals 不一致。

当违反前三条时,很有可能造成排序算法死循环(亲身经历)。

在 compareTo 方法中直接比较大于小于是非常繁琐的,可以使用 Java 8 新增的接口:Comparator

这里有一个比较的例子,根据实体类的字段进行比较:

@Getter
@Setter
@ToString
public static class MyEntity implements Comparable<MyEntity> {
    private static final Comparator<MyEntity> COMPARATOR = Comparator.nullsLast(
            Comparator.comparing(MyEntity::getName)
    );

    private String name;

    @Override
    public int compareTo(MyEntity o) {
        return COMPARATOR.compare(this, o);
    }
}

使用 Comparator 静态方法构造一个 Comparator 接口进行比较,会更加方便、易读(需要注意 null)。

标签:第三章,Effective,true,方法,clone,equals,compareTo,Java,重写
From: https://www.cnblogs.com/aliveneko/p/17864719.html

相关文章

  • javaswing 文本框的使用lambal表达式的应用
    package百度翻译实验;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTextField;publicclassframeextendsJFrame......
  • javaswing控件以及事件监听器
    package百度翻译实验;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTextField;publicclassframeextendsJFrame......
  • elasticsearch在Java中查询指定列的方法
     背景ES在查询时如果数量太多,而每行记录包含的字段很多,那就会导致超出ES的查询上线,默认是100MB,但是很多场景下我们只需要返回特定的字段即可,那么如何操作呢。主要代码@AutowiredprivateRestHighLevelClientclient;publicList<Map<String,Object>>search(Stringindex){......
  • vue3+vite 代码混淆插件 | JavaScript obfuscator
    安装插件yarnadd--devrollup-plugin-javascript-obfuscator创建obfuscator.js文件,把下面相应代码放入js文件中importobfuscatorPluginfrom'rollup-plugin-javascript-obfuscator';exportfunctioncodeObfuscatorPlugin(isBuild){if(!isBuild){return[];}......
  • java.io.IOException: 断开的管道
      2023-10-0911:45:51.834ERROR[http-nio-8080-exec-33]com.zkh360.gbb.admin.component.GlobalExceptionHandler82-[TxId:,SpanId:][,,][e979a4ac16968231501251001f1577]【Exception】异常处理,org.apache.catalina.connector.ClientAbortException:java.io.IO......
  • java打包
    title:java打包author:ZHdate:2022-01-0912:14:30tags: -java基础categories:java基础typora-root-url:../../../sourcejava打包用法:jar{ctxui}[vfmn0PMe][jar-file][manifest-file][entry-point][-Cdir]files...选项:-c创建新的存档文件,如果指......
  • 第三章 编码风格
    第三章编码风格注释总结起来一句话:优秀的代码本身就容易阅读,注释只需要提供有用的附加信息分解分解(decomposition)指将代码分为小段.理想情况下,每个函数或方法都应该只完成一个任务.任何非常复的子任务都应该分解为独立的函数或方法.重构(refactoring)指重新构建代......
  • Java开发者的Python快速进修指南:实战之跳表pro版本
    之前我们讲解了简易版的跳表,我希望你能亲自动手实现一个更完善的跳表,同时也可以尝试实现其他数据结构,例如动态数组或哈希表等。通过实践,我们能够发现自己在哪些方面还有所欠缺。这些方法只有在熟练掌握之后才会真正理解,就像我在编写代码的过程中,难免会忘记一些方法或如何声明属性......
  • java Date类型数据如何比较大小
    ......
  • pdf转换工具-java开发
    一:导入包 Spire.Pdf.jar 百度自己找对应的jar包,完后引入项目  二:实际应用【示例1】PDF转WordPdfDocumentpdf=newPdfDocument("D:\\资料\\001资料\\DolphinScheduler2.x学习\\笔记\\尚硅谷大数据技术之.pdf");pdf.saveToFile("D:\\资料\\001资料\\DolphinSche......