您的位置:首页 > Web前端

Effective Java 学习笔记(二)

2004-12-04 10:24 399 查看
Effective java是美国Joshua Bloch所著,书中共十章57个条目,每个条目给出了一条用于改进程序性能和设计方案的规则。

第七条:在改写equals的时候请遵守通用约定
        约定的内容来自java.lang.object的规范:
        1、自反性(reflexive)。对于任意的引用值x, x.equals(x)一定为true。
        2、对称性(symmetric)。对于任意的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)也一定返回true。
        3、传递性(transitive)。对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true ,那么x.equals(z)也一定返回true。
        4、一致性(consistent)。对于任意的引用值x和y,如果用于equals比较的对象信息没有被修改的话,那么多次调用x.equals(y)要么一致地返回true,要么一致地返回false。
        5、对于任意的非空引用值x,x.equals(null)一定返回false。
        
        如何高质量实现equals方法:
        1、使用==操作符检查“实参是否为指向对象的一个引用”。如果是的话,返回true,这只不过一种性能优化,如果比较操作有可能非常耗时的话,这样做是值得的。
        2、使用instanceof操作符检查“实参是否为正确的类型”。如果不是的话,则返回false。通常,“正确的类型”是指equals方法所在的那个类。
        3、把实参转换到正确的类型。因为前面有了instanceof测试,所以这个转换可以确保成功。
        4、对于该类中每一个“关键(significant)”域,检查实参中的域与当前对象中对应的域值是否匹配。
        5、当你编写完成了equals方法后,应该问自己三个问题:它是否是对称的、传递的、一致的?
        6、当你改写equals的时候,总是要改写hashCode
        7、不要企图让equals方法过于聪明。
        8、不要是equals方法依赖于不可靠的资源。
        9、不要将equals声明中的object对象替换为其他的类型。

第八条:改写equals时总是要改写hashCode
        相等的对象必须具有相等的散列码(hashcode)

第九条:总是要改写toString
        java.lang.object提供了tostring方法的一个实现,他包含类的名字,以及一个“@”符号,接着是散列码的无符号十六进制表示。提供一个好的tostring实现,可以使一个类使用起来更加愉快。当一个对象被传递给pringln,字符串连接操作符(+)以及1.4发行版本中的assert的时候,toString方法会自动被调用。

第十条:谨慎地改写clone
        x.clone() != x  结果为true
        x.clong().getclass() == x.getclass() 结果为true
        x.clone().equals(x) 结果为true
        如果你改写了一个非final类的clone方法,则应该返回一个通过调用super.clone而得到的对象。实际上,clone方法是另一个构造函数;你必须确保它不会伤害到原始的对象,并且正确地建立起被克隆对象中的约束关系(invariant)。clone结构与指向可变对象的final域的正常用法是不兼容的。

第十一条:考虑实现Comparable接口
      它是java.lang.Comparable接口中唯一的方法。compareto方法允许进行简单的相等比较,也允许执行顺序比较。一个类实现了comparable接口,就表明它的实例具有内在的排序关系(natural ordering)。若一个数组中的对象实现了comparable接口,则对这个数组进行排序非常简单:  
        Arrays.sort(a)
        下面的程序依赖于string实现了comparable接口,它去掉了命令行参数列表中的重复参数,并按字母表顺序打印出来:
        public class WordList {
            public static void main (String[] args) {
                Set s = new TreeSet();
                s.addAll(Arrays.asList(args));
                System.out.println(s);
            }
        }
        编写compareTo方法:
        public int compareTo(Object o ){
            PhoneNumber pn = (PhoneNumber)o;
            if (areaCode < pn.areaCode)
                return -1;
            if (areaCode > pn.areaCode)
                return 1;
            return 0;
        }
        简化:
        public int compareTo(Object o) {
            PhoneNumber pn = (PhoneNumber)o;
            int areaCodeDiff = areaCode - pn.areaCode;
            if(areaCodeDiff != 0)
                return areaCodeDiff;
        }
          
      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息