第2条:遇到多个构造器参数时要考虑用构建器 某个类的属性较多,初始化的时候又有一些是必须初始化的,而且类型有形同, 比如new Contact("姓名","显示名","手机号","飞信号","所在地",年龄,性别); 前5个属性是String 类型,后2个是int类型,在填写构造方法的时候很容易填写错位,或者少填写,或者颠倒了属性, 如下方法可以减少这种错误发生的几率, Contact contact = new Contact(); contact.setName("姓名"); contact.setDisplayName("显示名"); contact.setPhoneNumber("手机号"); contact.setFetionNumber("飞信号"); contact.setHometown("所在地"); contact.setAge(23); contact.setGender(0); 这么写是通常的做法,看起来还不够清晰,我们在每个set方法里retrun一个Contact类型,比如 public Contact setName(String name) { this.name = name; return this; } 这样上面的构造Contact的代码就可以这么写了 Contact contact = new Contact() .setName("姓名") .setDisplayName("显示名") .setPhoneNumber("手机号") .setFetionNumber("飞信号") .setHometown("所在地") .setAge(23) .setGender(0); 这样写是不是更清爽了!属性不会再填写错误了!而且阅读代码的时候也一目了然,都给Contact初始化了那些属性,和属性的值是什么! 第3条:用私有构造器或者枚举类型强化Singleton属性 建议使用如下方法创建单例类 public final class Elvis { private static Elvis INSTANCE; private Elvis(){}; synchronized public static Elvis getInstance() { if( INSTANCE == null ) { INSTANCE = new Elvis(); } return INSTANCE; } //执行其他操作 private Object readResolve() { return INSTANCE; } } 这种构建方法好处,组成类的成员声明很清楚地表明了这个类是个Singleton,并且也解决了INSTANCE的同步问题, 没有暴露共有的INSTANCE变量,这样更有力于隐藏类的内部实现, 另外,改做法也很容易就可以修改成非单例模式,加上的readResolve方法可以保证反序列化时也是同一个对象。 第4条:通过私有构造器强化不可实例化的能力 我们软件中常用的常量集(Constants),工具集(Tool,Utility)都应该是不可实例化的类,那么他们应该如下构建 public final class Constants { private Constants() { throw new AssertionError(); } //其他常量的定义,或者静态方法的实现; } 这样可以防止被继承,被实例化。 第5条:避免创建不必要的对象 创建一个String对象,最佳方式如下 String str = "初始化值"; 如果一个String在创建的时候我们不确定他的值,建议如下创建 String str = ""; 强烈反对 String str = null; 这种写法,因为会有NullPointerException这个异常的危险,另外主要还有潜在隐患,比如做了如下操作 str += "ABC"; 那么str = nullABC;了这个不是想要的结果。 str = "";的初始化方式也有他的不足之处,在判断str是否有效的时候就要多加一个长度的判断如下 if( str==null||str.length()<=0 ){} 因为str的长度初始为0。 对于JDK1.5以后的版本有自动封装,自动拆装的功能,所以要尽量使用基本类型,尤其是长整型因为long 和Long很容易看差,而影响效率。 总之,要吝啬使用new操作符,他不仅会增加对象的数目,而且也给垃圾回收造成麻烦,还有潜在的内存泄漏风险,另外new操作也比较耗时。 第13条:使类和成员的可访问性最小化 第14条:在共有类中使用访问方法而非共有域 public的权限太大了,建议使用包级私有权限,也就是缺省(default)的访问级别。这样可以增加软件的防御性,public的变量应该杜绝使用, 可以使用get,set方法代替。这样可以不隐蔽数据域,也方便以后修改数据域。 第16条:复合优先于继承 第17条:要么为继承而设计,并提供文档说明,要么就禁止继承 继承不便于扩展,耦合性很大,继承打破了封装,因为基类向子类暴露了实现细节,基类的内部细节通常对子类是可见的,建议继承只限定在包内使用, 否则是非常危险的,对软件的防御行也有很大的破坏作用。 当父类的实现改变时可能要相应的对子类做出改变,也不能在运行时改变由父类继承来的实现。