Java写了很多年,很惭愧,直到最近才读了这本经典之作《Effective Java》,按自己的理解总结下,有些可能还不够深刻

一、Creating and Destroying Objects
  1. Consider static factory methods instead of constructors (factory方法可以拥有名称,可以避免重复创建,比如单例模式)
  2. Consider a builder when faced with many constructor parameters(对于多个参数的比较适用,更加灵活,比如有两个相同类型参数的构造函数无法分辨的情况)
  3. Enforce the singleton property with a private constructor or an enum type(单例模式,1.5后用枚举实现更合适)
  4. Enforce noninstantiability with a private constructor (不允许实例化的对象写一个私有构造函数,以避免滥用,比如工具类)
  5. Avoid creating unnecessary objects (不要多余的创建类,比如在循环中去反复创建对象,特别需要避免的是基本类型和装箱类型的反复转换)
  6. Eliminate obsolete object references (比如对于pop操作,pop一个元素后要把数组的那一位无用的元素置为null)
  7. Avoid finalizers(除了一些关闭资源操作,不要再finally里包含不必要的处理)
二、Methods common to all objects
  1. Obey the general contract when overriding equals (equals方法覆盖时参数等必须对照上)
  2. Always override hashcode when override equals (equals覆盖时hashcode方法也要override,因为在集合类中的操作时为了快速会先比较hashcode)
  3. Always override toString (主要是为了使外界更容易了解实例信息)
  4. Override clone judiciously (clone方法要保证不改变原有实例)
  5. Consider implementing Comparable (对于需要排序的情况,实现Comparable接口是个好的选择)
 
三、Classes and interfaces
  1. Minimize the accessibility of classes and members (只给类和方法最小的访问权限是防止滥用的第一步)
  2. In public classes, user accessor methods, not public fields (这也是POJO的原因,因为可以在get,set方法里做额外的事情并且对于变化可控)
  3. Minimize mutability (尽可能限制可变,对于不需要变更要限制,加上final,private等限制)
  4. Favor composition over inheritance (组合优先于继承,其实继承是对封闭原则的一种破坏)
  5. Design and document for inheritance or else prohibit it (对于父类,需要写明注释)
  6. Prefer interfaces to abstract classes (接口优先于抽象类,因为继承只能是一个来源)
  7. Use interfaces only to define types (可用接口来声明类别)
  8. Preffer class hierachies to tagged classes (所谓的标签类是指一个类中拥有标签的属性,比如类可以被tag成圆形或者方形,这种情况用继承比较好)
  9. Use function objects to represent strategies (strategy pattern是策略模式,是允许在运行时选择算法的一种模式)
  10. Favor static member classes over nonstatic (对于不需要外界访问的内部类,用static是为了减少开销)
四、Generics
  1. Don't use raw types in new code (对于list,set等最好不要用raw类型,指明类型有助于提前让编译器发现错误)
  2. Eliminate unchecked warnings (也是为集合类而言)
  3. Prefer lists to arrays (推荐用list的原因也在于编译器可以发现错误,而数组不能检查元素类型)
  4. Favor generic types (E,V这种类型有助于代码复用)
  5. Use bounded wildcards to increase API flexibility (通配符?类型有助于API的灵活性)
  6. Consider typesafe heterogeneous containers
 
五、Enums and annotations
  1. Use enum instead of int constants (这个不用多说)
  2. Use instance fields instead of ordinals (对于枚举类,不要用ordinals来取其整数值)
  3. Use EnumSet instad of bit fields (用枚举集合来代替“位”属性,因为位移这种属性实在可读性差)
  4. Use EnumMap instead of ordinal indexing (用枚举的map代替ordinal方法来排序或者索引)
  5. Emulate extensible enums with interfaces (用接口实现枚举的可扩展性)
  6. Prefer annotations to naming patterns (注解的方法可以避免拼写等错误)
  7. Consistently use the Override annotation (如果是覆盖,用override注解能让编译器来检查错误)
  8. Use marker interfaces to define types (接口定义类型)
六、Methods
  1. Check parameters for validity (方法内检查参数的有效性是必要的)
  2. Make defensive copies then needed (所谓防卫性的copy,是为了防止外界构造实例后再次更改内部数据)
  3. Design method signatures carefully (方法的命名https://en.wikipedia.org/wiki/Naming_convention_(programming),参数个数不要过多)
  4. Use overloading judiciously (重载方法的选择是静态的,而重写方法的选择是动态的)
  5. Use varargs judiciously (可变参数的缺点运行时才会发现,可以用传递第一个必要的参数,剩下的用可变参数来解决)
  6. Return empty arrays or collections not nulls (减少空指针错误)
  7. Write doc comments for all exposed API elements (注释)
 
七、General programming
  1. Minimize the scope of local variables (封闭性原则)
  2. Prefer for-each loops to traditional for loops (减少中间参数使用)
  3. Know and use the libraries (尽量使用标准库的方法)
  4. Avoid float and double if exact answers are required (flocat,double是科学计算而生,如果需要精确值,使用int,long,BigDecimal代替)
  5. Prefer primitive types to boxed primitives (尽量使用基本类型)
  6. Avoid strings where other types are more approprivate (String虽然使用简单,但能用精确类型更好)
  7. Beware the performance of string concatenation (老生常谈问题,字符拼接用StringBuilder)
  8. Refer to obejects by their interfaces (用接口来做类型的引用会使代码更加灵活)
  9. Prefer interfaces to reflection (反射虽然好用但很多问题只有在运行时才能被发现)
  10. Use native methods judictiously (JVM为了支持多个语言允许native方法但一般不这样做,如果仅仅是为了提高性能)
  11. Optimize judiciously (改善性能的时候多考虑更改带来的后果)
  12. Adhere to generally accepted naming conventions (Java命名规范:http://docs.oracle.com/javase/specs/jls/se7/html/index.html
 
八、Exceptions
  1. Use exception only for exceptional conditions (正常逻辑不应该用Exception)
  2. Use checked exceptions for recoverable conditons and runtime programming errors (需要继续操作的用checked exception)
  3. Avoid unnecessary use of check exceptions
  4. Favor the use of standard exceptions
  5. Throw exceptions appropriate to the abstraction
  6. Document all exceptions thrown by each method
  7. Include failure-capture information in detail message
  8. Strive for failure atomicity (异常的原子性)
  9. Don't ignore exceptions
 
九、Concurrency
  1. Synchronize  access to shared mutable data
  2. Avoid excessive synchronization (同步不要泛滥)
  3. Prefer executors and tasks to threads
  4. Prefer concurrency utilities to wait and notify
  5. Document thread safety
  6. Use lazy initialization judiciously
  7. Don't depend on the thread scheduler
  8. Avoid thread groups
 
十、Serialization
  1. Implement serializable judiciously
  2. Consider using a custom serialized form
  3. Write readObject method defensively
  4. For instance control, prefer enum types to readResolve
  5. Consider serializations proxies instead of serialized instances
 
 
 

【Effective Java】阅读的更多相关文章

  1. Effective Java阅读笔记——引言

    “我很希望10年前就拥有这本书.可能有人认为我不需要任何Java方面的书籍,但是我需要这本书.” ——Java之父 James Gosling 在图书馆找到这本java著作时,首先看到了这句话.   ...

  2. Effective Java 阅读笔记——并发

    66:同步访问共享的可变数据 synchronized:1互斥,阻止线程看到的对象处于不一致的状态:2保证线程在进入同步区时能看到变量的被各个线程的所有修改 Java中,除了long或者double, ...

  3. Effective Java 阅读笔记——枚举和注解

    30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加i ...

  4. Effective Java 阅读笔记——方法

    38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违 ...

  5. 阅读《Effective Java》每条tips的理解和总结(1)

    <Effective Java>这本书的结构是90来条tips,有长有短,每条tip都值的学习.这里根据对书中每条tip的理解做简短的总结,方便日后回顾.持续更新~ 1. 考虑用静态方法代 ...

  6. effective java 读后感

    think in java  , effective java  这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...

  7. Effective Java 创建和销毁对象

    <Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...

  8. Effective Java 电子书 apk版本下载

    下载安装包以后,安装即可阅读该书了,并且实时展示每章节代码哦,并且可以运行哦,赶快下载体验吧. Effective Java中文第二版下载地址:下载 应用截图:

  9. Effective Java实作hashCode() - 就是爱Java

    hashCode()这个方法,也是定义在Object class中,这个是所有class的base class,因此所有的class也都继承这个方法,预设是传回这个对象储存的内存地址编号,因为Mix覆 ...

随机推荐

  1. Tornado之抽屉实战(2)--数据库表设计

    经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 ? 1 2 3 4 5 6 7 ...

  2. 使用广播退出打开了多个activity的程序

    新建一个父类,在父类里动态注册广播,在这个广播的onrecive方法中结束当前activity,让每个activity继承这个父类,在要关闭的activity中发送广播,搞定 下面是代码 父类 pro ...

  3. SpringBoot04 日志框架之Logback

    1 日志框架选择 日志门面:SLF4J 日志实现:Logback 2 实现控制台的日志打印输出01 2.1 在需要实现日志信息打印的类中实例化Logger对象 坑01:springBoot项目默认使用 ...

  4. winform 打印

    pageSetupDialog 打印设置,和对话框控件差不多的套路,把控件拖到窗口中后,会在下方显示, 然后在制作的菜单中找到打印设置,双击进入点击事件写代码 按照之前的套路, DialogResul ...

  5. 100741A Queries

    传送门 题目 Mathematicians are interesting (sometimes, I would say, even crazy) people. For example, my f ...

  6. 36-OLED显示实验

    1.OLED原理 有四种工作模式 先把片选拉低,如果是写的话,把RD拉高,在WR的上升沿写数据到数据线上,DC决定是数据还是命令.读类似了. 2.程序显示原理 3.代码 4.自己写代码 http:// ...

  7. springcloud 定义切面实现对请求操作记录日志,方便后面分析接口详情

    package com.idoipo.infras.gateway.open.config; import com.alibaba.fastjson.JSON; import com.alibaba. ...

  8. javascript 获取iframe元素的方法

    javascript  获取iframe元素的方法 第一种: $("#IframeID").contents().find("div"); 第二种: $(win ...

  9. js 操作html dom

    author:冯永贤(Tony Feng,鸡鸣星),文章整合:internet <HTML DOM> 一:js能够改变HTML DOM 里面的什么内容 JavaScript 能够改变页面中 ...

  10. 在Linux x86_64环境下编译memcached

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached ...