2012年1月12日星期四

java best practice

ref
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 方法时要当心

没有评论:

发表评论