《Effective Java》笔记
来源:互联网 发布:金融行业前景知乎 编辑:程序博客网 时间:2024/05/18 02:46
创建和销毁对象:
1.考虑用静态工厂方法代替构造器。
优势:
有名称。如果构造器的参数本身没有确切的描述正被返回的对象,那么就有适当名称的静态工厂会更容易使用。一个类只能有一个带有指定签名的构造器(一种避开限制的方法是更改参数列表的顺序)。当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重选择名称突出区别。不必在每次调用时新建一个对象。如果程序经常请求创建相同的对象,并且代价很高,这项技术可以极大提高性能。可以返回原返回类型的任何子类型的对象。API可以返回对象,同时又不会使对象的类变成公有的。这项技术适用于基于接口的框架。在创建参数化类型实例的时候使代码变得更加简洁。Map<String,List<Stirng>> m = new HashMap<String,List<Stirng>>();随着参数变得越来越长,这一冗长的说明变得痛苦。用静态工厂方法,编译器可以替我们找到类型参数,这被称为类型推导。假设HashMap提供这个静态方法:public static <K,V> HashMap<K,V> newInstance(){ return new HashMap<K,V>(); } 就可以用以下代码代替上述代码:Map<String,List<String>> m = HashMap.newInstance(); 缺点:类如果不含公有的或者受保护的构造器,就不能被子类化。与其他的静态方法实际上没有任何区别.静态工厂方法惯用名称:valueOf,of,getInstance,newInstance,getType,newType.
2.遇到多个构造器参数时要考虑使用构建器
3.用私有构造器或者枚举类型强化Singleton属性
4.通过私有构造器强化不可实例化的能力
5.避免创建不必要对象
6.消除过期的对象引用
7.避免使用终结方法
对于所有对象都通用的方法:
8.覆盖equals是请遵守通用约定
equals方法实现了等价关系即(自反,对称,传递,一致性)对于任何非null的引用值x,x.equals(null)必须返回false。
实现高质量equals方法:
使用==操作符检查“参数是否为这个对象的引用”使用instanceof操作符检查“参数是否为正确的类型”把参数转换成正确的类型对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域匹配当编写完equals方法时考虑是否满足等价关系
9.覆盖equals时总要覆盖hascode
10.始终要覆盖tostring
11.谨慎的覆盖clone
类和接口:
12.考虑实现comparable接口
13.使类和成员的可访问性最小化
14.在公有类中使用访问方法而非公有域
15.使可变性最小化
16.复合优先于继承
17.要么为继承而设计,并提供文档说明,要么就禁止继承
18.接口优先于抽象类
19.接口只用于定义类型
20.类层次优先于标签类
21.用函数对象表示策略
22.优先考虑静态成员类
泛型:
23.请不要在新代码中使用原生态类型
24.消除非受检警告
25.列表优先于数组
26.优先考虑泛型
27.优先考虑泛型方法
28.利用有限制通配符来提升API灵活性
29.优先考虑类型安全的异构容器
枚举和注解:
30.用enum代替int常量
31.用实例域代替序数
32.用enumset代替位域
33.用enummap代替序数索引
34.用接口模拟可伸缩的枚举
35.注解优先于命名模式
36.坚持使用override注解
37.用标记接口定义类型
方法:
38.检查参数的有效性
39.必要时进行保护性拷贝
40.谨慎设计方法签名
41.慎用重载
42.慎用可变参数
43.返回0长度的数组或者集合,而不是null
44.为所有导出的API元素编写文档注释
通用程序设计:
45.将局部变量的作用域最小化
46.foreach循环优先于传统for循环
47.了解和使用类库
48.如果需要精确的答案,避免使用float和double
49.基本类型优先于装箱基本类型
50.如果其他类型更适合,避免使用字符串
51.当心字符串连接的性能
52.通过接口引用对象
53.接口优先于反射机制
54.谨慎的使用本地方法
55.谨慎的进行优化
56.遵守普遍接受的命名惯例
异常:
57.只针对异常的情况才使用异常
58.对可恢复的情况使用受检异常,对编程错误使用运行时错误
59.避免不必要的使用受检的异常
60.优先使用标准的异常
61.抛出与抽象相对应的异常
62.每个方法抛出的异常都要有文档
63.在细节消息中包含能捕获失败的信息
64.努力使失败保持原子性
65.不要忽略异常
并发:
66.同步访问共享的可变数据
67.避免过度同步
68.executor和task优先于线程
69.并发工具优先于wait和notify
70.线程安全性的文档化
71.慎用延迟初始化
72.不要依赖于线程调度器
73.避免使用线程组
序列化:
74.谨慎的实现serializable接口
75.考虑使用自定义的序列化形式
76.保护性的编写readobject方法
77.对于实例控制,枚举类型优先于readresolve
78.考虑用序列化代理代替序列化实例
- 《Effective Java》笔记
- effective java学习笔记
- 《Effective Java》笔记
- Effective in Java 笔记
- 《Effective Java》笔记
- Effective java学习笔记
- effective java学习笔记
- effective java 学习笔记
- EFFECTIVE JAVA 笔记
- Effective Java 学习笔记
- Effective Java 笔记
- Effective Java 笔记
- Effective java笔记
- effective java 笔记
- Effective Java 学习笔记
- Effective Java笔记 (2)
- Effective Java学习笔记
- Effective Java学习笔记
- Linux 内核学习经验总结
- 面向对象:我笑,便面如春花,定能感动人,任他是谁
- 程序员秒懂,但会不会误导小朋友?
- C#下操作USB设备的方法
- 关于JSch的使用,执行ssh命令,文件上传和下载以及连接方式
- 《Effective Java》笔记
- 如何理解与快速构建python编程程环境,eclipse+pydev插件+python虚拟平台
- 趣图:新出了一个库,程序员想要跟上潮流的时候
- Java:单词倒排
- ssh_day01_01-今天内容介绍_02-svn概述和体系结构
- python并发之concurrent.futures
- ajax(1)---ajax概述
- [大数据]连载No3之Hadoop完全分布式环境搭建
- AI 的快速发展会给我们带来什么