EffectiveJava读书笔记
less, but is more.
- 创建和销毁对象
- 避免创建不必要对象
- 消除过期的对象引用
- 使可变性最小
- 泛型
- 用标记接口定义类型
- 检查参数有效性
- 返回零长度的数组或集合,而不是null
- 需要精确答案时,避免使用float和double
- 接口优先于反射机制
- 可恢复情况使用受检异常,编程错误使用运行时异常
- 慎用延迟初始化及双重检查
创建和销毁对象
- 静态工厂方法代替构造器
- 优点
- 有名称
- 重用对象,考虑Flyweight模式
- 可返回子类型,多态
- 参数化类型实例,代码更简洁。右侧类型推导 Java7支持,Java优化
- 缺点
- 如果不含public或protected构造器,不能子类化
- 是个静态方法,doc中不会明确标识其起到了构造器作用
避免创建不必要对象
- 不可变对象,尽量重用而不是创建
- 优先使用基本类型,而不是装箱类型
- 衡量重用与new,小对象创建和回收毕竟是廉价的
消除过期的对象引用
- 过期对象,null值清空,如数组元素
- 缓存、监听器/回调时,尽量使用弱引用,如WeakHashMap,LinkedHashMap的removeEldestEntry
使可变性最小
不可变类,实例不可修改,创建时初始化,lifetime内固定不变,如String类,原则:
- 不提供修改对象状态的方法
- 类不可扩展,final
- 所有的域final
- 所有的域私有
- 任何可变组件均互斥访问
泛型
- 不要在新代码中使用原生态类型
- 原生态类型,失掉了泛型在安全性和表述性方面的所有优势。之所以Java支持原生态类型,也是保持对已有Java代码的兼容性(移植兼容性)
- 可以使用@SuppressWarnings("unchecked")消除非受检警告
- 泛型优先使用List而不是数组,数组是协变的
- 优先考虑泛型方法
- 利用有限制通配符提升API灵活性
- PECS(producer-extends,consumer-super)读 ?extends,写 ?super
- 所有的comparable和comparator都是消费者
用标记接口定义类型
- 标记接口(marker interface)无方法接口声明
- 标记接口,只应用给类和接口,可以用接口作为相关方法的参数类型,优点:
- 标记接口可以在编译时捕捉异常
- 更加精确的锁定
- 标记注解,单标记应用于任何程序元素时,考虑用此,优点:
- 可以添加一个或多个注解类型元素
- 支持注解作为编程元素之一的框架中具有一致性
检查参数有效性
编写方法或构造器时,应该考虑下参数有哪些限制,显式的检查来实施这些限制。
慎用重载
- 重载方法(overloaded method),重写/覆盖方法(overridden method)
- 参数数目相同时,尽量避免重载方法,尤其是参数类型有着关系(如继承)
返回零长度的数组或集合,而不是null
需要精确答案时,避免使用float和double
数值超过18位数字时,可以考虑BigDecimal
字符串连接的性能
- 当两个字符串通过+连接在一起时,他们的内容都要被拷贝,使用StringBuilder代替String,通过append方法进行操作。
- StringBuilder预先定义足够容量时,要比默认大小的StringBuilder快。【深有体会..】
接口优先于反射机制
- 反射缺点:
- 失去编译时的类型检查
- 反射访问的代码笨拙而冗长
- 性能损失(2~50倍,不确定)
- System.exit会终止整个VM....
可恢复情况使用受检异常,编程错误使用运行时异常
三种可抛出(throwable)结构:
- 受检的异常(checked exception)
- 运行时异常(runtime exception)
- 错误(error)
如果期望调用者能够适当的恢复,使用受检的异常。通过抛出每个受检异常,强迫调用者处理该异常,或者继续传播。
运行时异常和错误,不需要也不应该被捕获,毕竟往往是不可回复的情形。
慎用延迟初始化及双重检查
- 实例域,使用双重检查(double-check)需要配合volatile
- 静态域,使用lazy initialization holder class,(静态内部类=..=)
- 可重复初始化实例域,使用单重检查模式
EffectiveJava读书笔记的更多相关文章
- <EffectiveJava>读书笔记--02泛型数组
1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public c ...
- <EffectiveJava>读书笔记--01继承的使用注意
1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
- LOMA280保险原理读书笔记
LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...
随机推荐
- 『AngularJS』ngValue
原文 描述 绑定给定的表达式到input[select]或input[radio]的值,以便当这个元素被选中的时候,设置这个元素的ngModel到绑定的值.当需要使用ng-repeat来动态生成rad ...
- ibdata1文件损坏时恢复InnoDB单表测试
Preface ibdata1 file is a shared system tablespace of innodb engine.Although we always set v ...
- 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)
题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...
- 虚拟现实-VR-UE4-创建第一个C++项目——Hello word
这部分主要是调用在C++中用代码实现在游戏界面上面输出一行文字 第一步,新建C++版本的工程文件,在4.12版本以后,在创建后,都会自动打开Vs编译器. 如下图 在VS中点击编译,等带编译,第一次等待 ...
- CSP201604-1:折点计数
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- Sping工作原理
一. IoC(Inversion of control): 控制反转 1.IoC: 概念:控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 核心:bean工厂:在Sp ...
- android桌面悬浮窗仿QQ手机管家加速效果
主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗 ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...
- WIN8/8.1/10换系统常见的几个问题
1.如果高级选项中没有UEFI固件设置,这该怎么进入BIOS呢? 答:还有一种方法是,首先关闭快速启动,然后重启,开机画面出来之后按F1,F2,F12,delete,总有一个是对的(不确定的话可以四个 ...
- hdu 2838 Cow Sorting (树状数组)
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Codeforces Round #553 F Sonya and Informatics
题目 题目大意 给定一个长为 $n$($2 \le n \le 100$)的01串 $S$ .对 $S$ 进行 $k$($1 \le k \le 10^9$)次操作:等概率地选取两个下标 $i, j$ ...