您的位置:首页 > Web前端

Effective Java读书笔记 第二部分(第7章-第11章)

2016-04-28 11:46 316 查看
第七章 方法
38.检查参数的有效性
方法体的开头检查参数

39.必要时进行保护性拷贝

40.谨慎设计方法签名
~谨慎地选择方法的名称
~不要过于追求便利的方法
~避免过长的参数列表

41.慎用重载
java语言中添加了泛型和自动装箱之后,破坏了List接口

42.慎用可变参数
+Re

43.返回零长度的数组或者集合,而不是NULL
返回类型为数组或者集合的方法没有理由返回NULL,而不是返回一个零长度的数组或者集合

44.为所有导出的API元素编写文档注释

第8章 通用程序设计
45.将局部变量的作用域最小化
~在第一次使用它的地方声明
~局部变量的声明都应该包含一个初始化表达式

46.for-each循环优先于传统的for循环
~for-each 可以避免传统for循环和迭代器的一些bug。并且没有性能损失
~for-each 可以遍历集合和数组外,还可以遍历任何实现Iterable接口的对象
不过有三种情况无法使用for-each循环
1.过滤-删除集合中的某个元素
2.转换-修改元素
3.平行迭代-迭代器或者索引变量可以同步前移

47.了解和使用类库
java.lang
java.util

48.如果需要精确的答案,请避免使用float和double
~float和double类型尤其不适合用于货币计算

49.基本类型优先于装箱基本类型
~java中有两种数据类型:基本类型和引用类型,每个基本类型都有对应的引用类型,称为装箱基本类型
三大区别
     基本类型  装箱基本类型
1.只有值          引用对象值相同 但是可以是不同的对象
2.只有功能完成的值 除了功能值外还有一个非功能值:null
3.更加节省时间和空间

什么时候使用装箱基本类型 
1.作为集合中的元素,键和值。因为基本类型不能放到集合中
2.参.数化类型

50.如果其他类型更适合,则尽量避免使用字符串
~字符串不适合代替其他的值类型。
~字符串不适合代替枚举类型
~字符串不适合代替聚焦类型
~字符串也不适合代替能力表

51.当心字符串连接的性能
~连接多个字符串,请使用StringBuilder

52.通过接口引用对象
~如果有合适的接口类型存在,那么对于参数,返回值,变量和域来说,就都应该使用接口类型进行声明。
~用接口作为类型,程序将更加灵活,接口类型的引用可以引用任何实现接口的对象
~如果一些类实现了接口,同时也提供了接口中不存在的额外方法,需要引用这些额外防范,就不适合通过接口来引用对象

53.接口优先于反射机制
反射机制付出的代价
~丧失了编译时类型检查的好处
~执行反射访问所需要的代码非常笨拙和冗长
~性能损失

54.谨慎地使用本地方法

55.谨慎地进行优化

56.遵守普遍接口的命名惯例
~包名,类和接口名称,方法和域的名称,常量域

第九章 异常
57.只针对异常的情况才使用异常

58.对可恢复的情况使用受检异常,对编程错误使用运行时异常
~三种继承throwable的异常:受检的异常,运行时异常和错误
1.如果期望调用者能够适当地恢复,对于这种情况就应该使用受检的异常。抛出此类异常,强迫调用者在一个catch自居中处理该异常
2.后面两种异常属于不可以恢复的情形,用运行时异常来表明编程错误

~我们自己实现的所有未受检的抛出接口都应该是RuntimeException的子类

59.避免不必要地使用受检的异常

60.优先使用标准的异常
~使API更加易于学习和使用,符合程序员的习惯用法
~更好的可读性,不会出现很多程序员不熟悉的异常
~异常类越少,装载这些类的时间开销也越少

61.抛出与抽象相对应的异常

62.每个方法抛出的异常都要有文档
~如果一个方法可能抛出多个异常类,不要声明一个方法throws Exception,这样的声明方式没有
给程序员提供关于这个方法能够抛出哪些异常的指导信息
~为每个受检异常提供单独的throws子句,不要为未受检的异常提供throws子句

63.在细节消息中包含能捕获失败的信息
~为了捕获失败,异常的细节信息应该包含素有“对该异常有贡献”的参数和域的值

64.努力使失败保持原子性
65.不要忽略异常
~空的catch块会使异常达不到应该有的目的,忽略了异常
~如果需要忽略,需要添加一条说明,解释为什么可以忽略这个异常

第十章 并发
66.同步访问共享的可变数据
~当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步

67.避免过度同步
~过度同步可能会导致性能降低、死锁、甚至不确定的行为
~为了避免火星失败和安全性失败,在一个被同步的方法或者代码块中,永远不要放弃对客户端的控制

68.executor和task优先于线程
~工作单元 两种任务:Runnable和Callable(与Runnable相似,但是有返回值)
~执行机制 Executor FrameWork

69.并发工具优先于wait和notify

70.线程安安全性的文档化

71.慎用延迟初始化
~延迟初始化时延迟到需要域的值时才将它初始化的这种行为。

72.不要依赖于线程调度器
~任何依赖于线程调度器来达到正确性或者性能要求的程序,很有可能都是不可移植的

73.避免使用线程组
~线程组没有提供太多有用的功能,而且提供的许多功能还是有缺陷的

第11章 序列化
74.谨慎地实现Serializable接口
~实现Serializable的接口而付出的最大代价是,一旦一个类被发布,就打打降低了‘改变这个类的实现’的灵活性
~第二个代价是它增加了出现BUG和安全漏洞的可能性
~第三个代码,随着类发行新的版本,相关的测试负担也增加了
~为了继承而设计的类应该尽可能少地去实现Serializable接口,用户的接口也应该尽可能少地继承Serializable接口。

75.考虑使用自定义的序列化形式
~如果没有先认真考虑默认的序列化形式是否合适,则不要贸然接受
~不管选择哪种序列化形式,都要为自己编写的每个可序列化的类声明一个显式的序列版本UID

76.保护性地编写readObject方法

77.对于实例控制,枚举类型优先于readResolve

78.考虑用序列化代理代替序列化实例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息