研究源码时候,首先会看到一个类,但是这个类的复杂度以及到底做了什么,并不是很清楚,这里总结了一些经验。 1 ** 对象是实体类,还是抽象类,还是接口**。接口类看有几个接口以及默认方法,接口越多职责越多,接口参数越多发生耦合可能性越大。抽象类看抽象方法,是否是模板模式,是否是钩子方法,是否是流程的一部分,看是否提供了相应层级的抽象程度。实体类的话看继承结构,是否有defalut修饰符,从而是能在包内使用,或者是否是protected,是否为了给子类继承用的。如果有内部类,需要看是否是静态内部,还是非静态内部,两种设计截然不同。这里类,方法,属性修饰符非常重要。final,protected,static,private等等.... 2 **对象如何覆写Object和经典接口。**经典方法toString,clone,hashCode,equals方法必看。如何实现经典的接口,如Comparable,Cloneable, Serializable(序列化的transient字段),Iterable接口,这些接口影响了是否能作为集合的元素或者key使用?原子变量没有equals和hashcode方法。 3 ** 实例属性字段。**字段越多,状态越多,维护状态付出代价越高,从而可以看出类的复杂度,以及状态流转。对象是否有生命周期的概念?是否用了复杂的算法实现逻辑?如果静态字段过多,是否影响OO?作者本身是否理解OO?? 4 **如何实例化。**是静态工厂还是new,还是便利类实例化?还是builder?还是工厂创建?还是对象池化呢?还是反射实例化?以及创建代价如何,比如数据库连接创建代价高。effective java第一章+设计模式创建型足矣。 5 如何处理异常。 异常是客户端使用API的“感到意外的”情况。方法入口参数校验,受检异常还是非受检异常?并发包核心异常是中断异常。InterruptedException非常重要。 6 线程安全。是否不可变,是否有安全和活跃性问题,Integer不可变。 7 对象名字是否恰当和通用。对象名字是否有隐喻,对象是否可扩展,可配置,对象是否依赖过多别的对象导致理解起来复杂,对象到底做了什么,与别的对象职责是否清晰? 8 是否用了设计模式和Idiom? 是否有领域内通用模式,比如并发领域的:线程池,Mutex,Lock,信号量,闭锁,条件队列,阻塞队列,forkjoin等不区分语言,领域通用,比如IO,这些应该是通用的模式。GOF设计模式分为三大类,这块主要考察结构和行为模式。 9 **类的继承结构。如果类的继承结构复杂,那么每一层继承子类到底实现了什么功能?是否合理的实现了继承?Map是接口,AbstractMap实现了骨架是集合框架的核心思路。 10 ** 具体方法实现。 API实现的核心。是否行数太多?是否注释清晰?(具体没想好怎么快速理解) 11 **DEMO。看着API是否可以写出简单的DEMO来?是否方便测试? 12 ** 性能如何。 集合的压力测试可以看出优化效果。 13 **新收获和反思。**是否有新理解,不怕重复看,怕重复没有新的理解和认识。如果是我,我该如何实现?为什么别人能做到,而我做不到?我该如何改进和超越?是否可以进一步封装?是否开源项目已经进一步封装了?(Guava对于JDK,SpringJDBC+事务对于原生JDK-JDBC的业界经典案例),技术是否有亮点?