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


本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/844921,如需转载请自行联系原作者

相关文章
|
5月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
207 1
|
6月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
6月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
102 1
|
6月前
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
63 2
|
6月前
|
Java Android开发
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
885 1
|
7月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
180 4
|
6月前
|
IDE Java Linux
探索安卓开发:从基础到进阶的旅程Java中的异常处理:从基础到高级
【8月更文挑战第30天】在这个数字时代,移动应用已经成为我们日常生活中不可或缺的一部分。安卓系统由于其开放性和灵活性,成为了开发者的首选平台之一。本文将带领读者踏上一段从零开始的安卓开发之旅,通过深入浅出的方式介绍安卓开发的基础知识、核心概念以及进阶技巧。我们将一起构建一个简单的安卓应用,并探讨如何优化代码以提高性能和应用的用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和启发。
|
7月前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
93 3
|
8月前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
66 0
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH