Effective Java读书笔记 第一部分(第二章-第六章)

来源:互联网 发布:八月经济数据 编辑:程序博客网 时间:2024/04/30 07:56
工作之后开始读Effective Java 这本书 ,阅读的过程中发现,这些编程中需要注意的一些小tips真得很管用,一些技术大牛编写的框架中也都有一些体现,值得阅读多次的一本书。

第二章 创建和销毁对象
1.考虑用静态工厂方法代替构造器-DONE
静态工厂方法与构造器相比 优势:
~静态共产方法可以自定义方法名称,确切地描述返回的对象
~不必在调用静态工厂方法的时候都创建一个新对象
~它们可以返回原返回类型的任何子类型的对象
~在创建参数化类型实例的时候,它们使代码变得更加简洁
缺点:
~类如果不含公有的或者受保护的构造器,就不能被子类化
~它们与其他的静态方法实际上没有任何区别

2.遇到多个构造器参数时要考虑用构建器
+RE

3.用私有构造器或者枚举类型强化Singleton属性
实现单例的两种方法:
~构造器私有访问权限,声明一个public static final 成员变量指向这个构造器声明的对象的引用
~将对象成员变量声明为私有,然后创建一个静态工厂方法返回这个成员变量

4.通过私有构造器强化不可实例化的能力
~常用的一些工具类不希望被实例化
~构造器私有化得类不能被子类化
~常用的方法是将构造器私有化,并且在方法里面抛出一个错误,避免在内部调用这个类

5.避免创建不必要的对象

6.消除过期的对象引用
~虽然java有GC功能 但是并不代表我们不需要对内存进行管理
~需要手工去清除一些无意识的对象保持
~自己管理内存的类,容易出现内存泄漏的情况

7.避免使用终结方法

第三章 对于所有对象都通用的方法
8.覆盖equals时请遵守通用约定
~比较多的通用约定

9.覆盖equals时总于鏊覆盖hashcode

10.始终要覆盖toString
~如果不覆盖,则会默认调用超类Object的toString方法
~在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息

11.谨慎地覆盖clone

12.考虑实现Comparable接口
~具有内在排序关系的值类可以考虑实现这个接口

第4章 类和接口
13.使类和成员的可访问性最小化
~模块之前通过api进行通信,而不需要知道其他模块内部工作情况,设计良好的模块会隐藏所有的实现细节,
这就是封装
~尽可能地使每个类或者成员不被外界访问
科普 4种访问级别 权限递增
!private:只有在类内部才能访问
!package-private:没有为成员指定访问修饰符 就默认为这个级别,该成员的包内的任何类都可以访问
!protect:包内部的任何类都可以访问,并且该成员类的子类也可以访问
!public:任何地方都可以访问

14.在公有类中使用访问方法而非公有域

15.使可变性最小化
如何使类不可变?
~不要提供任何会修改对象状态的方法
~保证类不会被扩展
~使所有的域都是final的
~使所有的域都成为私有的
~确保对于任何可变组件的互斥访问

16.复合优先于继承(类的继承)
只有当子类真正是超类的子类型,才适合继承
继承机制容易将父类中的缺陷传播到子类中

17.要么为继承而设计,并提供文档说明,要么就禁止继承

18.接口优先于抽象类
~现有的类可以很容易被更新,以实现新的接口
~接口是定义混合类型的理想选择
~接口允许我们构造非层次结构的类型框架

19.接口只用于定义类型
当类实现接口时,接口就可以充当这个类的实例的类型

20.类层次优于标签类

21.用函数对象表示策略

22.优先考虑静态成员类
嵌套类是指被定义在另一个类的内部的类:
~静态成员类
~非静态成员类
~匿名类
~局部类

第五章 泛型
23.请不要在新代码中使用原生态类型
使用原生态类型 会失去类型安全性
24.消除非受检警告
~要尽可能地消除每一个非检警告,全部消除意味着你的代码都是类型安全的
~如果无法消除警告,同事可以证明引起警告的代码是类型安全的,可以用@SuppressWarning("unchecked")
注解来禁止这条警告

25.列表优先于数组
~数组是协变,so what does it means
如果sub为super的子类型,那么数组类型sub[]就是super[]的子类型
而泛型则是不可变得,对于任何两个不同的类型type1和type2,List<Type1>既不是List<Type2>的子类型,也不是List<Type2>的超类型

利用数组,你会在运行时发现所犯的错误;而利用列表,则可以在编译时发现错误
~数组是具体化的

26.优先考虑泛型

27.优先考虑泛型方法
28.利用有限制通配符来提升API的灵活性
+RE
29.优先考虑类型安全的异构容器

第六章 枚举和注解
30.用enum代替int常量
为了将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并将数据保存在域中的构造器。

31.用实例域代替序数
永远不要根据枚举的序数导出与它关联的值,而是要将它保存在一个实例域中

32.用EnumSet代替位域

33.用EnumMap代替序数索引

34.用接口模拟可伸缩的枚举

35.注解优先于命名模式

36.坚持使用Override注解
37.用标记接口定义类型
标记接口是没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口

0 0