`
swordinhand
  • 浏览: 312452 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Effective Java 读书笔记(2)

    博客分类:
  • JAVA
阅读更多
    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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics