Effective Java其他碎片建议1

来源:互联网 发布:数据库黑客大曝光 编辑:程序博客网 时间:2024/06/07 11:39

Rule4、通过私有化构造器来强化不可实例化的能力

不应该通过抽象化类来强化类不可实例化的能力,因为抽象类仍然可以被继承,一旦该类被继承则可以被实例,而且很容易误导到代码阅读者,认为这个类就是用来继承的。



Rule5、避免创建不必要的对象

String a = new String("abcd");//这是绝对不可以的

String a = "abcd";//最好这样写 因为字符串"abcd"会到常量区去寻找是否存在"abcd"这个字符串,如果存在就不用创建新的字符串,而是直接重用该对象。


可以使用map存储多个key-value,名称-对象键值对,这样可以做到当名称相同的时候总是返回相同的实例,而不是重新创建新的对象。


尽量使用基本类型而不是装箱后的基本类型,比如使用int i= 0 ;而不是Integer i = 0;,避免无意识的自动装箱。

关于Int和Integer的区别


当应该创建新的对象的时候,不要尝试重用当前的对象

当应该重用当前对象的时候,不要尝试去创建新的对象



Rule6、消除过期的对象引用

java是一门具有垃圾回收功能的语言,然而这不代表程序员可以完全不考虑垃圾回收问题,比如对于以下程序段,进行一个弹栈操作:

public Object pop(){    return element[size--];//为了简便 这里就不考虑弹栈失败了}
是不是除了没判断size之外没有什么问题,然而事实上以上的代码出现了内存泄漏的问题,严重时可能会出现程序失败(OutOfMemoryError),为什么会这样,因为栈内部维护着被pop出来的过期引用,所谓过期引用就是永远不会被解除的引用,这些引用是需要被清除的。所以需要做出以下修改:

public Object pop(){    Object result = element[size];    element[size] = null;//help gc    return result;//为了方便我还是没判断size 23333}



Rule7、避免使用终结方法(finalize)

这个东西是不可预测、危险、而且没有必要的,不要把它和C/C++的析构函数混为一谈。



Rule8、重写equals需要注意的问题

之前写过



Rule9、如何重写hashCode()

1、选择一个非0的常数值,比如17,保存在一个名为result的变量里。

2、对于对象中每个关键域f,完成以下步骤:

    ①.为该域计算int类型的散列码c:

        a.    boolean -->  (f?1:0)

        b.    byte/char/short/int -->(int)f

        c.    long -->(int)(f^(f>>>32))

        d.    float -->Float.floatToIntBits(f)

        e.    double -->Double.doubleToLongBits(f) 然后再计算这个long类型对应的值

        f.     如果是一个对象引用,则递归调用这个对象的hashCode()

        g.    对于数组,每个元素都当成一个单独的域

    ②.针对①中每一个散列码,用下面的方式合并到result中:

        result = 31*result+c;

3、返回result,单元测试,适当修改

在计算hashCode的过程中可以把冗余码排除在外,也就是可以由已知域计算出来的域可以排除。



Rule10、始终覆盖toString()  //个人觉得没前面那些那么重要



Rule11、谨慎覆盖clone()

专家级程序员一般不覆盖clone方法,也不去调用它



Rule12、考虑实现comparable接口



Rule13、使类和成员的可访问性最小化

信息隐藏是软件设计的基本原则之一

1、尽可能使每个类或者成员不被外界访问

2、实例域绝对不能使公开的,如果域是非final的,或者是一个指向可变对象的final引用,那么一旦这个域变成共有的,这个域的变化便是不可控的,也就意味着包含共有可变域的类不是线程安全的。

3、长度非0的数组总是可变的,所以类具有静态final数组域或者返回这种域的访问方法几乎总是错误的。



Rule14、在共有类中使用访问方法而不是共有域

简单来说就是使用getter/setter方法代替共有域


未完待续...