您的位置:首页 > Web前端

《Effective java中文第2版》读书笔记1

2009-11-25 11:28 190 查看
第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条:要么为继承而设计,并提供文档说明,要么就禁止继承

继承不便于扩展,耦合性很大,继承打破了封装,因为基类向子类暴露了实现细节,基类的内部细节通常对子类是可见的,建议继承只限定在包内使用,

否则是非常危险的,对软件的防御行也有很大的破坏作用。

当父类的实现改变时可能要相应的对子类做出改变,也不能在运行时改变由父类继承来的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: