1. Effective Java第二版总结

创建与销毁对象

  1. 考虑使用静态工厂方法(非设计模式的工厂方法)代替销毁器;
  2. 遇到多个构造器参数时要考虑使用构建器;
  3. 用私有构造器或者枚举类型强化sigleton属性;
  4. 通过私有构造器强化不可实例化的能力;例如:用于工具类
  5. 避免创建不必要的对象;例如:可将共性的东西抽出来
  6. 消除过期的对象引用;例如:可将数组中减少的对象进行置空
  7. 避免使用终结方法;

对于所有对象都通用的方法

  1. 覆盖equals请遵守通用约定;例如:自反性,对称性,传递性,一致性
  2. 覆盖equals时总要覆盖hashcode;
  3. 始终要覆盖toString;
  4. 谨慎的覆盖clone;
  5. 考虑实现Comparable借口;

类和接口

  1. 使类和成员的可访问性最小化;
  2. 在公有类中使用访问方法而非公有域;例如:封装
  3. 使可变性最小化;例如:多使用final;
  4. 复合优先于继承;
  5. 要么维继承而设计,并提供文档说明,要么就禁止继承;
  6. 接口优于抽象类;
  7. 接口只用于定义类型;
  8. 类层次优于标签类;
  9. 用函数对象表示策略;
  10. 优先考虑静态成员类;

泛型

  1. 请不要在新代码中使用原生态类型;例如:能用List<String>,不用List
使用原生态类型会在运行时导致异常,因此不要在新代码中使用。原生类型只是为了与引入泛型之前的遗留代码进行兼容和互用而提供的。让我们个快速的回顾;SetObject>是个参数化类型,表示可以包含任何对象类型的一个集合;Set<?>则是一个通配符类型,表示只能包含某种未知对象类型的一个集合:Set则是个原生态类型,它脱离了泛型系统。前两种是安全的,最后一种不安全。
  1. 消除非受检异常;例如:使用@SuppressWarnings("unchecked")
  2. 列表优先于数组;
数组和泛型有着非常不同的类型规则,数组是协变且可以具体化的;泛型是不可变的且可以被擦除的。因此,数组提供了运行时的类型安全,但是没有编译时的类型安全。反之,对于泛型也一样。一般来说,数组和泛型不能很好地混合使用如果你发现自己将它们混合起来使用,并且得到了编译时错误或者警告,你的第一反应就应该是用列表代替数组
  1. 优先考虑泛型;
使用泛型比使用需要在客户端代码中进行转换的类型来得更加安全,也更加容
易。在设计新类型的时候,要确保它们不需要这种转换就可以使用。这通常意味着要把类成是泛型的,只要时间允许,就把现有的类型都泛型化。这对于这些类型的新用户来说会变得更加轻松,又不会破坏现有的客户端
  1. 优先考虑泛型方法;例如:同第四条规则思想相同
  2. 利用有限制通配符来提升API的灵活性;
在API中使用通配符类型虽然比较需要技巧,但是使AP变得灵活得多,如果编
写的是将被广泛使用的类库,则一定要适当地利用通配符类型。记住基本的原则 producer-exrends. consamer-super(PECS)还要记住所有的 comparable和 comparator都是消费者

7.优先考虑类型安全的异构容器;


枚举和注解

  1. 用enum代替枚举常量;
  2. 用实例域代替序数;例如:指名枚举序号,不用自带ordinal
  3. 用EnumSet代替位域;
  4. 用EnumMap代替序数索引;
  5. 用接口模拟可伸缩的枚举;例如:继承
  6. 注解优先于命名模式;例如:@Test
  7. 坚持使用@Override注解;
  8. 用标记接口定义类型;

方法

  1. 检查参数的有效性;例如:校验入参
  2. 必要时进行保护性拷贝;例如:只是引用地址不变,内容改变
  3. 谨慎设计方法签名;例如:命名规范,参数合理
  4. 慎用重载;例如:父子类参数重载
  5. 慎用可变参数;
  6. 返回零长度的数组或者集合,而不是null;
  7. 为所有导出的API元素编写文档注释;

通用程序设计

  1. 将局部变量的作用域最小化;
  2. for-each优先于传统的for循环;
  3. 了解和使用类库;例如:Random.nextInt()与Random.nextInt(int)
  4. 如果要使用精确的答案,请避免使用float或double;
  5. 基本类型优先于装箱基本类型;例如:容易出错或影响性能;
  6. 如果其他类型更合适,则尽量避免使用字符串;
  7. 当心字符串连接的性能;例如String与StringBuilder
  8. 通过接口引用对象;
  9. 接口优先于反射机制;
  10. 谨慎的使用本地方法;
  11. 谨慎的进行优化;
  12. 遵守普遍接受的命名习惯;

异常

  1. 只针对异常的情况才使用异常;
  2. 对可恢复的情况使用受检异常,对编程错误使用运行时异常
  3. 避免不必要的使用受检的异常;
  4. 优先使用标准的异常;
  5. 抛出与抽象相对应的异常;
  6. 每个方法抛出的异常都要有文档;
  7. 在细节信息中包含能捕获失败的信息;
  8. 努力使失败保持原子性;
  9. 不要忽略异常;

并发

  1. 同步访问共享的可变数据;
  2. 避免过度同步;
  3. executor和task优先于线程;
  4. 并发工具优先于wait和notify; 例如:使用CountDownLatch
  5. 线程安全性的文档化;
  6. 慎用延迟初始化;例如:单例双重锁检查懒汉式
  7. 不要依赖于线程调度器;
  8. 避免使用线程组;

序列化

  1. 谨慎的使用Serializable接口;
  2. 考虑使用自定义的序列化形式;
  3. 保护性的编写readObject方法;
  4. 对于实例控制,枚举类型优先于readResolve;
  5. 考虑使用序列化代理代替序列化实例;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 清晰性和简洁性最重要 模块尽可能小 重用代码 模块间依赖性尽可能小 错误尽早被检测出来 二.创建和销毁对象 1.考...
    热爱生活的舒舒阅读 200评论 0 0
  • 第1条:考虑用静态工厂方法代替构造器 优点: 1.静态工厂方法与构造器不同的第一大优势在于,它们有名称。 2.静态...
    TomyZhang阅读 592评论 0 0
  • 创建和销毁对象 静态工厂方法替代构造器1⃣️有名称2⃣️无需每次创建的时候创建一个新的对象 类似享元模式3⃣️ 可...
    34sir阅读 453评论 0 0
  • 第一条 考虑使用静态工厂方法代替构造器 优势 有名称 不必每次调用的时候都创建一个对象 返回原返回类型的所有子类型...
    没有颜色的菜阅读 333评论 0 0
  • 第1条:考虑用静态工厂方法代替构造器 这不同于设计模式中的工厂方法,我们可以理解它为“在一个类中用一个静态方法来返...
    whoami2019阅读 443评论 0 1