版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://onbus.blogbus.com/logs/10898226.html
一、创建和销毁对象
1,考虑以static factory method取代构造函数 工厂(创建与使用分离)
2,以private构造函数进行singleton 单态(需要定义一个private static实例变量)
3,以private构造函数进行不可实例化 单态时要用,你不能new了吧,嘿嘿
4,避免创建重复对象 这个年代,能复用就复用吧(String str = new String("as long as you love me!"))
5,消除不用的object reference XXX = null(静静等待GC回收吧!)
6,避免使用finalize() GC回收前调用,但何时会进行GC不定(你不会自己System.gc()吧!)
二、Object的method
1,覆写equals()时请遵守通用的契约 是判断reference还是content???(对比==)
2,覆写equals()时总是一起覆写hashCode() 当用于HashMap(或Hashtable)的key时需要
3,总是覆写toString() 友好方式显示信息(讨厌 XXX@XXX!)
4,谨慎覆写clone() 注意深浅克隆
5,考虑实现Comparable 无语
三、类和接口
1,将类的member的存取性最小化 变量为private 对外方法为public 帮助(内部)方法为private
2,偏爱不变性 类的Field为private,且不提供public的set方法
3,优先考虑组合然后才是继承 具体情况具体分析,但即使继承也最好用abstract class
4,尽量以接口取代抽象类 面向接口编程嘛!(Struts里的基类Action改成接口不是更爽)
5,接口只应当被用来定义类型 “类型”?可以说是一种抽象类型,实现此接口即具有了其特征
6,优先考虑static member class,然后才是non-static 特别是new后不变的对象
四、方法
1,检查参数的有效性 前置条件(design by contract,不要想当然别人一定会给你正确的东东)
2,必要时进行保护性拷贝 clone()(听到克隆(人)我就怕!相关电影看多了)
3,注意重载 英文名overload,不是override(覆盖)
4,宁愿返回长度为0的array,不要返回null NPE,我心中永远的痛!!!
5,为所有method提供文档注释 javadoc(我承认经常忘写,反省ing)
五、一般原则
1,将变量的作用域尽量最小化 用private(如对外,加public get/set方法),特殊用protected
2,尽量用用标准库API 不要重复发明轮子好不好
3,如果其他类型更适合,就不要使用字符串 怀疑:Web(HTTP)中传来传去都是字符串(省去类型转换,呵呵)
4,注意字符串连接的效率 没错,用StringBuffer(调用append()、toString())
5,通过接口使用对象 接口与实现分离(地球人都知道,你不会不晓得吧!非常十分特别很重要)
6,优先使用接口,然后才考虑反射(reflection) 牛人稀饭用反射!
7,遵守普遍的命名习惯 小朋友,请遵守游戏的一般规则(用描述性的名称)
六、异常
1,只在异常情况下才使用异常机制 偶却经常用于流程控制,悲哀!!!
2,对可恢复状态使用检查异常(Exception),对编程错误使用运行期异常(RuntimeException)
3,不要滥用检查异常 用好throws,不要搞得到处是try/catch(check VS uncheck)
4,尽量使用标准异常 不够时自己extends Exception(RuntimeException),最好定义自己的基类异常
5,抛出与其抽象性相应的异常 异常分层、分类,不要太细
6,对每一个方法所抛出的每一个异常说明 check exception需要,uncheck不需要
7,以详细的信息记录失败情况下的异常 考虑chain exception,异常日志记录(17173)
8,不要忽视异常 try/catch后不作处理(捕获但不(或随便)处理),做事要负责啊!!!
七、多线程
1,同步存取共享之可变数据 synchronized(本质是在对象实例或Class对象上加了锁)
2,避免过度使用同步机制 同步意味着什么?性能下降
3,注意多线程安全 thead-safe?怕怕,让容器处理
4,不要倚赖执行时的线程调试器 因为是抢占式调用(机会均等,基本上是先来先“服务”,VIP除外)
八、序列化
1,谨慎实现Serializable JavaBean、RMI需要(状态暂存、通过网络传输时都要)
2,考虑使用自定义的序列化方式 覆写writeObject() readObject()
1,考虑以static factory method取代构造函数 工厂(创建与使用分离)
2,以private构造函数进行singleton 单态(需要定义一个private static实例变量)
3,以private构造函数进行不可实例化 单态时要用,你不能new了吧,嘿嘿
4,避免创建重复对象 这个年代,能复用就复用吧(String str = new String("as long as you love me!"))
5,消除不用的object reference XXX = null(静静等待GC回收吧!)
6,避免使用finalize() GC回收前调用,但何时会进行GC不定(你不会自己System.gc()吧!)
二、Object的method
1,覆写equals()时请遵守通用的契约 是判断reference还是content???(对比==)
2,覆写equals()时总是一起覆写hashCode() 当用于HashMap(或Hashtable)的key时需要
3,总是覆写toString() 友好方式显示信息(讨厌 XXX@XXX!)
4,谨慎覆写clone() 注意深浅克隆
5,考虑实现Comparable 无语
三、类和接口
1,将类的member的存取性最小化 变量为private 对外方法为public 帮助(内部)方法为private
2,偏爱不变性 类的Field为private,且不提供public的set方法
3,优先考虑组合然后才是继承 具体情况具体分析,但即使继承也最好用abstract class
4,尽量以接口取代抽象类 面向接口编程嘛!(Struts里的基类Action改成接口不是更爽)
5,接口只应当被用来定义类型 “类型”?可以说是一种抽象类型,实现此接口即具有了其特征
6,优先考虑static member class,然后才是non-static 特别是new后不变的对象
四、方法
1,检查参数的有效性 前置条件(design by contract,不要想当然别人一定会给你正确的东东)
2,必要时进行保护性拷贝 clone()(听到克隆(人)我就怕!相关电影看多了)
3,注意重载 英文名overload,不是override(覆盖)
4,宁愿返回长度为0的array,不要返回null NPE,我心中永远的痛!!!
5,为所有method提供文档注释 javadoc(我承认经常忘写,反省ing)
五、一般原则
1,将变量的作用域尽量最小化 用private(如对外,加public get/set方法),特殊用protected
2,尽量用用标准库API 不要重复发明轮子好不好
3,如果其他类型更适合,就不要使用字符串 怀疑:Web(HTTP)中传来传去都是字符串(省去类型转换,呵呵)
4,注意字符串连接的效率 没错,用StringBuffer(调用append()、toString())
5,通过接口使用对象 接口与实现分离(地球人都知道,你不会不晓得吧!非常十分特别很重要)
6,优先使用接口,然后才考虑反射(reflection) 牛人稀饭用反射!
7,遵守普遍的命名习惯 小朋友,请遵守游戏的一般规则(用描述性的名称)
六、异常
1,只在异常情况下才使用异常机制 偶却经常用于流程控制,悲哀!!!
2,对可恢复状态使用检查异常(Exception),对编程错误使用运行期异常(RuntimeException)
3,不要滥用检查异常 用好throws,不要搞得到处是try/catch(check VS uncheck)
4,尽量使用标准异常 不够时自己extends Exception(RuntimeException),最好定义自己的基类异常
5,抛出与其抽象性相应的异常 异常分层、分类,不要太细
6,对每一个方法所抛出的每一个异常说明 check exception需要,uncheck不需要
7,以详细的信息记录失败情况下的异常 考虑chain exception,异常日志记录(17173)
8,不要忽视异常 try/catch后不作处理(捕获但不(或随便)处理),做事要负责啊!!!
七、多线程
1,同步存取共享之可变数据 synchronized(本质是在对象实例或Class对象上加了锁)
2,避免过度使用同步机制 同步意味着什么?性能下降
3,注意多线程安全 thead-safe?怕怕,让容器处理
4,不要倚赖执行时的线程调试器 因为是抢占式调用(机会均等,基本上是先来先“服务”,VIP除外)
八、序列化
1,谨慎实现Serializable JavaBean、RMI需要(状态暂存、通过网络传输时都要)
2,考虑使用自定义的序列化方式 覆写writeObject() readObject()