首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Effective Java 读书笔记(二)

2012-09-24 
Effective Java 读书笔记(2)8,在重写equals方法时要遵守一些约定。并不是每个类都需要重写equals方法,但是

Effective Java 读书笔记(2)
    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

热点排行