《Effective Java中文版》第二版 读书笔记

     《Effective java》第二版基于Jdk1.5,虽然现在最新的jdk是jdk10,但书中内容主要介绍的是Java的一些编程规范、java编程思想,所以依然值得大家去读,可供大家学习的地方还很多。以下是自己对这本书的一些总结,由于篇幅原因,只做简单介绍,让大家知道有这么一个概念。

    正如书的引言所说,本书的目的是帮助读者最有效地使用Java程序设计语言及其基本类库:java.lang、java.util、java.util.concurrent、java.io。顾名思义,Java程序员要想往更高的方向发展,这几个包下的类库必须要熟,书中还有一个特别重要的思想我们一定要谨记——代码应该是被重用,而不是被拷贝。

    1、关于创建和销毁对象

            a、考虑用静态工厂方法代替构造器创建对象,

            b、遇到多个构造器参数时要考虑用构建器,

            c、用私有构造器或者枚举类型强化Singleton属性,

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

            e、避免创建不必要的对象,如String s = new String("sb);改进后应该String s = "sb"。

            f、消除过期的对象引用,一般而言,只要类是自己管理内存,程序员就应该警惕内存泄漏问题。

            g、避免使用终结方法(finalizer)。

    2、关于类的一些通用方法,比如equals/hashCode/toString方法,了解这些方法的作用以及用法,慎用clone方法,当类实现Comparable接口时需要注意哪些。

    3、关于类和接口

            a、使类和成员的可访问性最小化,即能不对外公开就不设置为public将其访问权限在不影响程序结构的前提下最小化,成员变量尽量不对外暴露。

            b、接口优先于抽象类。

            c、方法覆盖的时候尽量加上@Override注解

    4、关于泛型

            a、在没有泛型之前,从集合中读取到的每一个对象都必须进行转换。如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。编译器自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。这样可以使程序既更加安全。也更加清楚。

     5、关于枚举

            a、用enum代替int常量,枚举使程序更加安全,增强程序的易读性。

     6、关于方法

            a、如何处理参数和返回值,如何设计方法签名,如何为方法编写文档,可在以下几个方向考虑:一检查参数的有效性,谨慎设计方法签名(见名知意),避免过长的参数列表(最好不超过四个参数);二是方法重载时需要注意参数,调用哪个重载方法是在编译时就做出决定的。

            c、方法尽量返回零长度的数组或者集合,而不是null。

      7、关于通用程序设计

            a、将局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明,过早的声明局部变量不仅会使它的作用域过早地的扩展,而且结束得也过于晚了。

            b、for-each循环优先于传统的for循环,在某些情况下,比起普通的for循环,它稍有些性能优势。

            c、如果需要精确的答案,请避免使用float和double,请尽量用BigDecimal/int或者long进行货币运算。

            d、基本类型优先于装箱基本类型,有时用装箱类型导致性能下降。

            f、如果其他类型更适合,请尽量避免使用字符串。字符串不适合代替其他的值类型,字符串不适合代替枚举类型,字符串不适合代替聚合类型。

            g、当心字符串连接的性能,连接请用StringBuffer或者StringBuilder。

     8、关于异常

            a、异常是为了在异常情况下使用而设计的,不要将它们用于普通的控制流,如下

                        try{

                                    int i = 0;

                                     while(true){

                                                rang[i++].climb();                                      

                          }catch(ArrayIndexOutOfBoindsException e){

                           }

              b、永远不要声明一个方法throws Exception,这样的声明不仅没有为程序提供关于“这个方法能够抛出哪些异常”的任何指导信息,而且大大地妨碍了该方法的使用,因为它实际上掩盖了该方法在同样的执行环境下可能抛出的任何其他异常。

               c、捕获异常,打印异常堆栈信息。

       9、关于并发

                a、同步访问共享的可变数据,同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。

                b、尽量用线程池开启线程。

        10、关于序列化

                a、将一个对象编码成一个字节流称作对象序列化,相反的处理过程被称作反序列化。一旦对象被序列化之后,它的编码就可以从一台正在运行的虚拟机被传到另一台虚拟机上,或者被存储到磁盘,供以后反序列化时用。序列化技术为远程通信提供了标准的线路级对象表示法,也为javaBean组件结构提供了标准的持久化数据格式。

猜你喜欢

转载自blog.csdn.net/yy455363056/article/details/79940520