less, but is more.

创建和销毁对象

  • 静态工厂方法代替构造器
  • 优点
  • 有名称
  • 重用对象,考虑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读书笔记的更多相关文章

  1. <EffectiveJava>读书笔记--02泛型数组

    1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public c ...

  2. <EffectiveJava>读书笔记--01继承的使用注意

    1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该 ...

  3. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  4. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  5. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  6. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  7. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  8. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  9. LOMA280保险原理读书笔记

    LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...

随机推荐

  1. Java Set集合(HashSet、TreeSet)

    什么是HashSet?操作过程是怎么样的? 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素 ...

  2. Python第二天 (数据类型,变量 )

    1. 把任意数据类型赋值给变量 在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,例如: 例子:a = 123 # a是整数 prin ...

  3. LeetCode 237 ——删除链表中的结点

    1. 题目 2. 解答 因为给定的只有一个待删除的结点指针,我们并不知道其前面结点,所以需要将待删除结点后面的结点值复制到前面结点去,然后指向其后的第二个结点即可. /** * Definition ...

  4. RMQ问题+ST算法

    一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...

  5. DFS(2)——hdu1241Oil Deposits

    一.题目回顾 题目链接:Oil Deposits 题意:给你一块网格,网格被分为面积相等的地块,这些地块中标记'@'的是油田,标记'*'的不是油田.已知一块油田与它上下左右以及对角线的油田同属一片油区 ...

  6. chromium源码阅读

    linux下chromium的入口函数在文件:src/chrome/app/chrome_exe_main_aura.cc 中 int main(int argc, const char** argv ...

  7. LTE中基于S1的切换

    1:源eNodeB决定进行基于S1的切换.S1切换的原因可能是源eNodeB和目标eNodeB之间不存在X2连接,或者源eNodeB根据其他情况作出的判断. 2:源eNodeB向源MME发送Hando ...

  8. appendTo()方法和append()方法

    appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容.

  9. [链接] Linux下常见的~/.bashrc、/etc/profile、/etc/ld.so.config小科普以及caffe编译遇到的相关问题解决

    由于博主设置禁止转载,这里贴一个链接,http://blog.csdn.net/u014266895/article/details/61928602,内容很有用,linux下很多软件问题都是各种路径 ...

  10. Educational Codeforces Round 58 (Rated for Div. 2) 题解

    Educational Codeforces Round 58 (Rated for Div. 2)  题目总链接:https://codeforces.com/contest/1101 A. Min ...