当前位置:编程学习 > JAVA >>

Android应用开发提高系列(1)——《Practical Java 中文版》读书笔记(上)

书籍
  《Practical Java 中文版》  03版  侯捷、刘永丹译  
  本书和《Effective Java》,对前述重要而基础的技术细微处有着详尽、深刻、实用的介绍、剖析和范例,又以独立条款之姿展现,在内容的扎实度、可读性及易读性上的表现均十分良好。
  本书围绕Java编程中遇到的实际问题展开。可以说书中所列专题正是那些令许多Java程序员困惑不已的FAQ。作者擅长采用恰如其分的示例来阐释问题,以平时的语言娓娓道出中肯的建议。这些建议往往一语中的,能直接融入编程工作中,可见它们确实是出自作者从实践中获得的真知灼见。
 
正文
  注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解。
  一、一般技术
    1.  Java唯一一种参数传递机制:by value(传值)。
    备注:当参数为对象时,以传值方式传递对象的引用。(个人理解:传递指针的拷贝)
 
    2.  对不变的data和object references使用final
    备注:当声明一个对象为final时,不能改变其指向,但能改变其对象的值。
 
    3.  缺省情况下所有非私有(non-private)、非静态(non-static)函数都可被覆写。
      3.1  如果函数不想被子类覆写,将函数声明为final即可。
      3.2  如果类不想被子类覆写,将类声明为final即可,从而禁止覆写该类所有函数。还能提高性能。
 
    4.  在数组和Vectors之间慎重选择。
  数组 Vector
存储数据类型 基本类型、引用类型 引用类型
元素默认值 Yes No
自动改变大小 固定不变 动态增长
速度快 Yes No
     备注: Vector内部实际是以数组实现的。
 
    5.  多态优于instanceof,必要时才使用instanceof。
    备注:例如从父类转型为派生类时,需要使用instanceof。
 
    6.  一旦不需要的对象引用,就将它设为null。
    备注:如果局部变量的引用使用完离函数结束前还需要执行较大代码,可在使用完后设置为null,以便或许能使其在垃圾回收器下次运行时被回收。
 
  二、 对象与相等性
    1.  区别  == 和 equals()
    备注:请使用 == 测试两个基本类型是否完全相同,或测试两个对象引用是否指向同一个对象;使用equals()比较两个对象的内容是否相等。
 
    2.  不要依赖equals()缺省实现
    备注:所有Java对象都隐含继承了java.lang.Object,默认的equals()只是检查对象引用是否指向同一个对象。
 
    3.  实现equals()建议:
      3.1  请检查是否等于this
        备注:测试是否指向同一个对象
      3.2  优先考虑使用getClass()
        备注:getClass()返回某个对象的运行期类(runtime class)。确保只有相同class所产生的对象才有机会被视为相等。范例:
 
    public class Base {

        @Override
        public boolean equals(Object obj) {
            if(obj != null && getClass() == obj.getClass()){
                //继续比较相等性或直接返回true
            }
            return false;
        }
    }
 
      3.3  调用super.equals()唤起父类的相关行为
        备注:当你为一个派生类撰写equals()时,你必须检查除java.lang.Object之外所有父类,看看它们是否都实现了equals()。如果有,那么一定要调用super.equals()。
      3.4  在equals()函数中谨慎使用instanceof
        备注:如果允许派生类和父类进行比较,可能要采用instanceof(getClass()会恒返回false)。注意instanceof类似于is-a语义,需要注意位置,即(子类 instanceof 父类 -> 返回true;反之为false)。
 
  三、 异常处理
    1.  认识异常流程机制
      备注:try区段 -> [catch捕获区段][可选] -> finally终结区段。
 
    2.  处理异常
      如果异常产生却未被捕获,发生异常的线程将中断。处理异常:
      a). 捕获并处理它,防止进一步传播。
      b). 捕获并抛出一个新的异常给调用端。
        备注:应确保新抛出的异常包含原异常相关信息,以保证不丢失重要信息。
      c). 不捕获,任其传播给调用端。
      输出错误信息:
      a). 日志文件记录曾经发生过的异常
      b). 输出异常
        输出到标准错误串流:如e.printStackTrace()。
 
    3.  防止出现异常覆盖
      备注:如果在catch或finally区段又抛出了未捕获的异常,新的异常将覆盖try抛出的异常,只有一个异常可被传播到调用段。
 
    4.  throws子句
      备注:提供throws子句的用意在于,提醒函数调用者,告知可能发生的异常。编译器会易做图调用端捕捉这些被列出的异常,所以不要再开发周期的最后才添加。
        如果覆写对象(某个父类函数)没有抛出任何异常,那么覆写函数因为增加了代码而引发异常,那么你必须在新函数中捕捉异常并处理。
 
    5.  使用finally避免资源泄漏
      备注:finally区段代码无论是否发生异常都将执行,尤其适合维护对象内部状态和清理non-memory资源。
 
    6.  使用建议:
      a). 不要从try区段执行return、break或continue语句离开try区段
        备注:如果try区段和finally区段都return 数据,将返回finally区段return的数据。
      b). 将try/catch区段置于循环之外
        备注:异常对代码性能产生负面影响
      c). 不要将异常用于流程控制
      d). 在构造函数中抛出异常
      e). 抛出异常之前将对象恢复为有效状态
        备注:考虑下次执行这段代码时会发生什么事情,代码是否还能正常运行。
 
结束
  预计本系列前几篇文章为《Practical Java》和《Effective Java》的读书笔记,后续内容还在规划当中,也欢迎大家把感兴趣的内容反馈给我作为潜在的系列文章。

 

摘自 农民伯伯
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,