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

简介:

前言

   从开始学习Android到现在,囫囵吞枣学了许多控件、布局的使用方法和技巧,看了许多相关的文章,也积累了不少项目经验。藉此通过归纳、总结和梳理相关知识,扎实基础,进一步提高Android开发技能。学好Android需要扎实的Java功底,所以将本文作为系列文章的开篇。本系列文章面向有一定Android开发经验的读者,欢迎交流!

 

声明

  欢迎转载,但请保留文章原始出处:) 

    博客园:http://www.cnblogs.com

农民伯伯: http://over140.cnblogs.com

 

书籍

  《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》的读书笔记,后续内容还在规划当中,也欢迎大家把感兴趣的内容反馈给我作为潜在的系列文章。


转自:http://www.cnblogs.com/over140/archive/2012/01/04/2308492.html

目录
相关文章
|
4小时前
|
存储 安全 物联网
使用 Java 进行物联网(IoT)应用开发
【4月更文挑战第19天】Java,凭借其跨平台特性和丰富库,成为物联网开发热门选择。开发者利用Java进行物联网应用开发,可实现设备连接、数据处理、数据库管理及安全保障。熟悉Java基础、物联网知识、数据通信和数据库管理是必备技能。利用MQTT客户端、数据存储框架和可视化工具能提升开发效率。随着物联网发展,Java在该领域的影响力将持续增强。
|
4小时前
|
存储 消息中间件 缓存
Android应用开发:实现自定义View的高效绘制
【5月更文挑战第12天】 在Android开发中,创建高性能的自定义视图是一项挑战,它要求开发者深入理解Android的绘图机制以及UI渲染过程。本文将探讨如何优化自定义View的绘制流程,减少不必要的重绘和布局计算,以提升应用的响应速度和流畅度。我们将介绍几种关键策略,包括利用硬件加速、缓存绘制内容和使用高效的数据结构来存储视图状态。通过实例分析和性能对比,读者将学会如何在自己的应用中运用这些技巧,从而打造出更加流畅和响应迅速的用户界面。
|
4小时前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
15 0
|
4小时前
|
移动开发 Java Android开发
Android应用开发:Kotlin语言的优势与实践
【5月更文挑战第7天】 在移动开发的世界中,Android平台的Kotlin语言以其高效、简洁的语法和强大的功能吸引了众多开发者。本文将深入探讨Kotlin语言的核心优势,并通过实际案例展示如何在Android应用开发中有效地运用这一现代编程语言。我们将从语言特性出发,逐步分析其在提升开发效率、改善代码质量以及增强应用性能方面的具体表现,为读者提供一个全面而细致的Kotlin应用开发指南。
|
4小时前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
|
4小时前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
24 5
|
4小时前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
4小时前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。
|
4小时前
|
SQL 存储 Java
令应用开发效率飙升的 Java 类库
更多地使用 Java 而避免存储过程和复杂 SQL 是当前应用开发的一个潮流,这会在架构上带来优势,但用 Java 实现 SQL 式的运算并不是非常方便,很多任务要从头写起,开发效率其实反而会降低。
|
4小时前
|
Java 测试技术 Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【4月更文挑战第26天】 在移动开发领域,性能优化一直是开发者追求的重要目标。随着Kotlin的兴起,其在Android平台上的应用逐渐增多,但关于Kotlin与Java在性能方面的对比,社区中仍存在诸多讨论。本文通过实际的性能测试,分析比较了使用Kotlin和Java编写的Android应用在多个维度上的运行效率,旨在为开发者提供一个明确的性能参考,帮助他们在选择编程语言时做出更加明智的决策。