1.尽量避免新建对象,优先使用懒加载 public class Countries { private List countries; public List getCountries() { //initialize only when required if(null == countries) { countries = new ArrayList(); } return countries; } } 2.不要将一个类的实例的属性设为public public class MyCalender { public String[] weekdays = {"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"}; } //better private String[] weekdays = {"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"}; public String[] getWeekdays() { return weekdays; } //上面还不是最好的,因为array对象仍然可以被修改 //best public String[] getWeekdays() { return weekdays.clone(); } 3.接口优于抽象类 4.限制局部变量的范围 在使用前定义且初始化 5.不要重复造轮子,用类库 6.原始类型优于包装类型,原始类型自动初始化且只含值,包装类型慢且存储整个类初始化为null 7.用字符串时要小心,特别是用+做连接操作很低效,每+一次新增一个对象 初始化时,直接赋值优于构造函数 8.返回空集合对象或数组对象而不是null 这样能省略许多非空判断 public String getEmployeeName() { return (null==employeeName ? "": employeeName); } 9.防御式拷贝 public class Student { private Date birthDate; public Student(birthDate) { this.birthDate = birthDate; } public Date getBirthDate() { return this.birthDate; } } public static void main(String []arg) { Date birthDate = new Date(); Student student = new Student(birthDate); birthDate.setYear(2019); System.out.println(student.getBirthDate()); } 修改birthDate时就把student的生日也修改了,因为他们指向同一对象,我们可以用对象拷贝解决 public Student(birthDate) { this.birthDate = new Date(birthDate); } 10.在finally语句中不要抛出异常,适当的记录异常日志 11.不要直接抛出java.lang.Exception!?此种做法违反了checked Exceptions的本意,同样调用处也得不到有用的信息 12.不要用浮点数表示精确数字,比如金额,用BigDecimal continue... 一般技术 实践1:参数以 by value 方式而非 by reference 方式传递 实践2:对不变的 data 和 object reference 使用 final 实践3:默认情况下所有非静态方法都可被重载 实践4:在 arrays 和Vectors 之间慎重选择 实践5:多态优于 instanceof 实践6:必要时才使用 instanceof 实践7:一旦不再需要 object references,就将它设为 null 对象与相等性 实践8:区分 reference type 和 primitive type 实践9:区分 == 和 equals() 实践10:不要依赖 equals() 的缺省实现 实践11:实现 equals() 时必须深思熟虑 实践12:实现 equals() 时优先考虑使用 getClass() 实践13:调用 super.equals() 以唤起基类的相关行为 实践14:在 equals() 方法中谨慎使用 instanceof 实践15:实现 equals() 时需遵循某些规则 异常处理 实践16:认识“异常控制流”机制 实践17:绝对不可忽视异常 实践18:千万不要遮掩(hide)异常 实践19:明察 throws 子句的缺点 实践20:细致而全面地理解 throws 子句 实践21:使用 finallly 避免资源泄漏 实践22:不要从 try 块中返回 实践23:将 try / catch 块置于循环之外 实践24:不要将异常用于流程控制 实践25:不要每逢出错就使用异常 实践26:在构造函数中抛出异常 实践27:抛出异常之前先将对象恢复为有效状态 性能 实践28:先把焦点放在设计、数据结构和算法身上 实践29:不要依赖编译期优化技术 实践30:理解运行期代码优化技术 实践31:如欲进行字符串拼接,StringBuffer 优于 String 实践32:将对象的创建成本降至最小 实践33:慎防未用上的对象 实践34:将同步减至最低 实践35:尽可能使用 stack 变量 实践36:使用 static、final 和 private 方法以促成内联 实践37:instance 变量的初始化一次就好 实践38:使用基本类型(primitive types)使代码更快更小 实践39:不要使用 Enumeration 或 Iterator 来遍历 Vector 实践40:使用 System.arraycopy() 来复制 arrays 实践41:优先使用 array,然后才考虑 Vector 和 ArrayList 实践42:尽可能复用(reuse)对象 实践43:使用延迟求值(lazy evaluation) 实践44:以手工方式将代码优化 实践45:编译为本机代码(native code) 多线程 实践46:面对 instance 方法,synchronized 锁定的是对象而非方法或代码 实践47:弄清楚 synchronized statics 方法与 synchronized instance 方法之间的差异 实践48:以“private 数据 + 相应访问函数(accessor)” 替换 “public/protected数据” 实践49:避免无谓的同步控制 实践50:访问共享变量时请使用 synchronized 或 volatile 实践51:在单一操作中锁定所有用到的对象 实践52:以固定而全局性的顺序取得多个locks以避免死锁 实践53:优先使用 notifyAll() 而非 notify() 实践54:针对 wait() 和 notifyAll() 使用旋锁(spin locks) 实践55:使用 wait() 和 notifyAll() 替换轮询循环 实践56:不要对上锁对象的对象引用重新赋值 实践57:不要调用 stop() 或 suspend() 实践58:通过线程之间的协作来终止线程 类与接口 实践59:运用接口来实现多继承 实践60:避免接口中的方法发生冲突 实践61:如需提供部分实现,请似乎用抽象类 实践62:区分接口(interface)、抽象类(abstract class)和实体类(concrete class) 实践63:审慎地定义和实现不可变(immutable)类 实践64:欲传递或接受可变(mutable)对象的对象引用时,请实现 clone() 实践65:使用继承或委托来定义不可变类 实践66:实现 clone() 时记得调用 super.clone() 实践67:别只依赖于 finalize() 清理内存以外的资源 实践68:在构造函数内调用 non-final 方法时要当心
2012年1月12日星期四
java best practice
ref
订阅:
博文评论 (Atom)
没有评论:
发表评论