欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Effective Java 读书笔记(2)

程序员文章站 2024-02-29 18:49:10
...
8,在重写equals方法时要遵守一些约定。并不是每个类都需要重写equals方法,但是如果你需要,记得要遵守自反性,对称性,一致性,传递性。如果父类可以被实例化,而子类又增加了值域,那么equals方法肯定会有问题,所以,多用组合,少用继承。Java类库里就有这样的例子,java.sql.Timestamp继承了java.util.Date并增加了一个值域nanos,破坏了对称性。

Date d = new Date();
Timestamp ts1 = new Timestamp(d.getTime());
System.out.println(d.equals(ts1));//true
System.out.println(ts1.equals(d));//false


9,如果重写equals方法,那么一定要重写hashcode方法。两个相等的对象一定要有相同的hashcode。
10,总是重写toString方法,提升可读性。
11,谨慎的实现clone方法,如果你不是继承了一个已经实现了clone方法的类,最好是不用clone,提供一个拷贝构造函数更好。
12,考虑实现Comparable接口。一般来说,compartTo方法的实现要和equals方法的实现相同,但是Java标准库里也有不符合的,比如BigDecimal,这样的话,把BigDecimal对象放在不同的Set里,行为就不一致了。

BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("1.00");
HashSet<BigDecimal> set1 = new HashSet<>();
set1.add(d1);
set1.add(d2);
System.out.println(set1.size());//2
TreeSet<BigDecimal> set2 = new TreeSet<>();
set2.add(d1);
set2.add(d2);
System.out.println(set2.size());//1
相关标签: 读书