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

简介:

书籍

  《Effective Java 中文版》  03版  潘爱民译  

  本书介绍了57条极具实用价值的经验规则。这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案,通过对Java平台设计专家所使用的技术的全面描述,揭示了应坐什么和不应做什么,才能产生清晰、健壮和高效的代码。

 

正文 

注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解。

  1.  构造函数一定不能调用可被覆写的方法,无论是直接还是间接进行。

 

  2.  接口应该只是被用来定义类型的,它们不应被用来导出常量。(备注:不要再接口中定义常量)P/89

 

  3.  一个安全而保守的策略是,永远不要导出两个具有相同参数数目的重载方法。

 

  4.  返回零长度的数组而不是null。

 

  5.   嵌套类

    嵌套类(nested class)是指被定义在另一个类的内部的类,其存在的目的应该只是为它的外围类提供服务。嵌套类分为四种:

      5.1  静态成员类(static member class)

        最简单的嵌套类,最好把它看做一个普通的类。它可以访问外围类的所有成员,包括那些声明为私有的成员。与其他类静态成员一样,也遵守同样的可访问性规则。

        其通常用法是作为公有的辅助类,仅当与它外部类一起使用时才有意义。

        私有静态成员类的一种通常用法是用来代表外围类对象的组件。例如,Map实例的内部通常有一个Entry对象对应与Map中每一对键值对,虽然每一个Entry都与一个Map关联,但Entry上的方法(getKey、getValue、setValue)并不需要访问该Map。因此使用非静态成员来表示Entry是浪费的,私有静态成员类是最佳的选择。

 

      5.2  非静态成员类(nonstatic member class)

        非静态成员类的每一个实例都包含一个额外指向外部类对象的引用。维护这份引用要消耗时间和空间。

        其通常用法是定义一个Adapter,它允许外围类的一个实例被看做另一个不相关的类的实例。例如,Map接口的实现往往使用非静态成员类来实现它们的集合视图。

 

      5.3  匿名类(anonymous class)

        没有名字,它不是外围类的一个成员,在使用的同时被声明和实例化。可以出现在代码中任何允许表达式出现的地方。通常只实现了其接口中或超类中的方法,不会声明任何新的方法,它们应该非常简短。

        用法1  是创建一个函数对象(function object),比如Comparator实例。例如:

        Arrays.sort(args,  new Comparator<String>() {
            @Override
             public  int compare(String obj1, String obj2) {
                 return obj1.length() - obj2.length();
            }
        });

        用法2  创建一个过程对象(process object),比如Thread、Runable或者TimeTask实例。

        用法3  在一个静态工厂方法的内部,如:

     static List intArrayList( final  int[] a){
         return  new AbstractList<Integer>() {

            @Override
             public Integer get( int location) {
                 return a[location];
            }

            @Override
             public  int size() {
                 return a.length;
            }};
    }

        用法4  在复杂的类型安全枚举类型中,用于公有的静态final域的初始化器中,例如:

     public  abstract  class Operation {
         private  final String name;

        Operation(String name) {
             this.name = name;
        }

         public String toString() {
             return  this.name;
        }

         abstract  double eval( double x,  double y);

         public  static  final Operation PLUS =  new Operation("+") {
            @Override
             double eval( double x,  double y) {
                 return x + y;
            }
        };
    }

 

       5.4  局部类(local class)

        使用最少,在任何“可以声明局部变量”的地方,都可以声明局部类,也遵守同样的作用域规则。与匿名类一样,它们必须非常简短。

    简而言之,如果一个嵌套类需要在单个方法之外仍然是可见的,或者它太长了,不适合放在一个方法内部,那么应该使用成员类。如果成员类的每个实例都需要一个指向其外围实例的引用,则把成员类做成非静态的;否则就做成静态的。假设一个嵌套类属于一个方法的内部,如果你只需要在一个地方创建它的实例,并且已经有了一个预先存放的类型可以说明这个类的特征,则把它做成匿名类;否则就做成局部类。

 

  6.  了解和使用库

    应该熟悉java.lang、java.util以及java.io中的内容。

    6.1  Random.nextInt(int)   产生随机整数。

    6.2  Collections.sort(v)  字符串组成的Vector排序

    6.3  Collections.sort(v, String.CASE_INSENSITIVE_ORDER)  字符串组成的Vector排序,忽略大小写

    6.4  System.out.println(Arrays.asList(a))  循环打印一个数组中所有的元素

    6.5  获取两个Hashtable包含相同映射键值的所有键:

        Map tmp =  new HashMap(h1);
        tmp.entrySet().retainAll(h2.entrySet());
        Set result = tmp.keySet();

    6.6  Arrays.toString(a)  打印数组每一个元素

    6.7  Arrays.equals(a1, a2)  比较两个数组长度、每一个元素是否相等。

 

 

  7.  使用异常

    7.1  被检查的异常(checked exception)

      通过抛出一个被检查的异常,强迫调用者在一个catch子句中处理异常,或者将它传播到外面。

    7.2  运行时异常(run-time exception)

      大多数的运行时异常都是指API的客户没有遵守API规范建立的约定。例如数组越界。

    总而言之,对于可恢复的条件,使用被检查的异常;对于程序错误,使用运行时异常。

 

  8.  尽量使用标准的异常

    8.1  IllegalArgumentException  调用者传递的参数不合适

    8.2  NullPointException  空指针异常

    8.3  IndexOutOfBoundsException  下标越界

    8.4  ConcurrentModificationException  在禁止并发修改的情况下,对象检测到并发修改

    8.5  UnsupportedOperationException  对象不支持所请求的方法

 

 

结束

  由于先读的 《Practical Java》,与本书内容有部分相似,所以看得比较快,仍然值得一读,也终于弄懂关于嵌套类这块的内容。


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

相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin在Android开发中的普及,了解其与Java在性能方面的差异变得尤为重要。本文通过深入分析和对比两种语言的运行效率、启动时间、内存消耗等关键指标,揭示了Kotlin在实际项目中可能带来的性能影响,并提供了针对性的优化建议。
30 0
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第18天】 在Android开发领域,Kotlin和Java一直是热门的编程语言选择。尽管两者在功能上具有相似性,但它们在性能表现上的差异却鲜有深入比较。本文通过一系列基准测试,对比了Kotlin与Java在Android平台上的运行效率,揭示了两种语言在处理速度、内存分配以及电池消耗方面的差异。此外,文章还将探讨如何根据性能测试结果,为开发者提供在实际应用开发中选择合适语言的建议。
|
3月前
|
数据采集 小程序 数据可视化
智慧校园电子班牌管理系统源码 Java Android原生
家长通过家长小程序端随时了解孩子在校的情况,实时接收学生的出勤情况,学生到校、离校时间。随时了解学生在校的表现、学生成绩排名,及时与教师沟通,关注孩子的健康成长。
30 0
智慧校园电子班牌管理系统源码 Java Android原生
|
4月前
|
开发框架 Java 数据库连接
深度剖析 Spring 框架在 Java 应用开发中的优势与应用
Spring 是用于企业 Java 应用程序开发的最流行的应用程序开发框架。全球数百万开发人员使用 Spring Framework 创建高性能、易于测试和可重用的代码。Spring Framework 是一个开源的 Java 平台。它最初由 Rod Johnson 编写,并于 2003 年 6 月在 Apache 2.0 许可下首次发布。
357 0
|
4月前
|
设计模式 Java C语言
Java之父都需要的《Effective Java中文版(第3版)》到底有多牛
你是否正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码?
|
5天前
|
存储 安全 物联网
使用 Java 进行物联网(IoT)应用开发
【4月更文挑战第19天】Java,凭借其跨平台特性和丰富库,成为物联网开发热门选择。开发者利用Java进行物联网应用开发,可实现设备连接、数据处理、数据库管理及安全保障。熟悉Java基础、物联网知识、数据通信和数据库管理是必备技能。利用MQTT客户端、数据存储框架和可视化工具能提升开发效率。随着物联网发展,Java在该领域的影响力将持续增强。
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】 在移动开发领域,性能优化一直是开发者关注的重点。随着Kotlin的兴起,许多Android开发者开始从传统的Java转向Kotlin进行应用开发。本文将深入探讨Kotlin与Java在Android平台上的性能表现,通过对比分析两者在编译效率、运行时性能和内存消耗等方面的差异。我们将基于实际案例研究,为开发者提供选择合适开发语言的数据支持,并分享一些提升应用性能的最佳实践。