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

声明

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

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

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

 

书籍

  《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》,与本书内容有部分相似,所以看得比较快,仍然值得一读,也终于弄懂关于嵌套类这块的内容。

 

转载:http://www.cnblogs.com/over140/archive/2012/01/29/2330758.html

时间: 2024-11-02 01:09:12

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

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

声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com   系列 Android应用开发提高系列(1)--<Practical Java 中文版>读书笔记(上)    正文  注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解. 一.性能 1. 先把焦点放在设计.数据结构和算法身上 备注:良好的设计.明智的选择数据结构和算法可能比高效代码更重要.   2.  不要依赖编译

Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源

前言  Android动态加载(下)--加载已安装APK中的类和资源.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com  Android中文Wiki:http://wikidroid.sinaapp.com     正文 一.目标 注意被调用的APK在Android系统中是已经安装的.    上篇文章:Android应用开发提高系列(4)--Android动态加载(上)--加载

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com  Android中文Wiki:http://wikidroid.sinaapp.com   正文 一.前提 目的:动态加载SD卡中Apk的类. 注意

《Effective Java》学习笔记(4)

笔记 五.C语言结构的替代 如何用java模拟c语言中的一些结构 第19条:用类代替结构     对于C语言中的结构,java可以用类来代替,不过你不应让类的成员变量可以被公开访问,成员变量应该是private,然后提供一些读写操作来操纵这些变量,想比于C或者C++里的结构类型,这样的类更为安全,体现了OOP的封装性.示例代码 public class Point{     private float x;    private float y;     public float getX(){

《Effective Java》学习笔记(3)

笔记  四.类和接口 第12条:使类和成员的可访问能力最小     为了更好的实现信息隐藏,降低各模块的耦合度,尽可能地降低类和成员的访问能力是必须的.有一点特别关键,就是公有的静态final域几乎全部是错误的.客户可以修改这样的成员数组,应该改为私有的才是安全的. 第13条:支持非可变类 使一个类成为非可变类需要做到以下5点: 1.不能提供任何会修改对象的方法 2.保证没有可被子类覆写的方法,可以通过使这个类为final来达到 3.使所有的成员变量都是final 4.使所有的成员变量都为私有

深入Java虚拟机读书笔记[6:7]

第六章 Java class文件 这章的内容讲的是编译后的class文件格式,我根据内容写了个class文件解析程序. https://github.com/JohnWong/class-file-parser 第七章 类型的生命周期 1. Java虚拟机通过装载.连接与初始化一个Java类型 连接步骤包括验证.准备.解析(可选).在类和接口被装载和连接的时机上,Java虚拟机规范给实现提供了一定的灵活性.但是要求每个类或者接口必须在首次主动使用时初始化.主动使用包括: a) 创建某个类的实例.

《Effective C++》读书笔记02:用const,enum,inline减少#define出场机会

以前学习c语言时,老师教导我们,对于数字最好用宏(#define)来定义它.以至于 一直习惯于#define Age 12这样的写法. 在c语言的环境中,这确实是增加程序可读性的有效做法,可是在c++中,可以有更优 美的实现方式. 1.当你写下 #define NUMBER 11.12 如果接下来使用NUBMER时出现了编译错误,那么由于在预处理过程中NUMBER已经被替 换为11.12了,编译器指出错误发生在11.12上,如果使用者不是你,肯定会对11.12感到 莫名其妙,要花不少时间追踪它.

深入Java虚拟机读书笔记[8:9]

第八章 连接模型 1. 动态连接和解析 每个类或者接口都编译为独立的class文件,他们之间通过接口(Harbor)符号相互联系,或者与Java API class文件相联系.class文件把所有引用符号保存在常量池,每一个class文件有一个常量池,被装载的类或者接口有一份内部版本的运行时常量池.常量池解析:根据符号查找到试题,把符号替换成直接引用.JDBC通常用forName装载时因为传递第三个参数为true时可以确保类被初始化,静态初始化方法会在DriverManger中被注册驱动程序.

深入Java虚拟机读书笔记[10:20]

第十章 栈和局部变量操作 第十一章 类型转换 第十二章 整数运算 第十三章 逻辑运算 第十四章 浮点运算 第十五章 对象和数组 第十六章 控制流 第十七章 异常 以上一些是操作码相关的内容, 第十八章 finally子句 微型子例程 字节码中的finally子句表现的很像微型子例程.Java方法与微型子例程使用不同的指令集.跳转到微型子例程的指令是jsr或者jsr_w,将返回地址压入栈.执行完毕后调用ret指令.ret指令并不会从栈中弹出返回地址,而是在子例程开始的时候将返回地址从栈顶取出存储在