【effective java】(一)

来源:互联网 发布:华东师范大学网络报名 编辑:程序博客网 时间:2024/06/06 14:28

考虑用静态工厂方法代替构造器

优点

1.有名称,易于区别
2.不创建新的实例,进行重复利用。使得类不可变性,不可实例化(有的对象创建的代价很高的时候,可以提高性能)
3.可以返回原返回对象的子对象(如返回元对象为接口,但是可以返回接口的实现类。提供服务提供者框架的基础)

缺点

1.类如果没有公共或保护的构造器,就不能被子类化(但是这样也成为了鼓励用组合,而不是继承)
2.和普通静态方法没有什么区别(但是,可以用一些常用的方法名来表示,例如:getInstance,newInstance,getType等等


遇到多个构造器参数时考虑用构建器

方法一:重叠构造器(提供几个必要,然后不断增长可选参数)
重叠 构造器
缺点:但是,有时只需要一个fat参数,却要填充其他参数的传入。而且也不方便阅读,如果不细读每个方法,每个参数的意义,那就很容易出错。

方法二:JavaBean方式(通过对象来传递参数)
缺点:多地方调用时,容易存在不一致,需要去保证线程安全。

方法三:Builder(保证安全性,并想JavaBean一样较好可读性)
原理:通过调用builder(静态内部类)传入必要的参数,来调用setter方法来确定一个不变的对象(外部类)。
Builder构建多参数
注意:
1.静态内部类
2.参数的传入是对内部类的设值
3.最后内部类返回的是外部类的实例对象

用处:当可选参数很多的时候,考虑用Builder,虽然Builder模式比重叠构造器更冗长,但是在可选参数不断增加的情况下,却利于后面的改造,不至于重构。


显示的私有构造器,防止被实例化。(如工具类就需要这样操作)


优先使用基本类型,而不是装箱类型。(装箱类型可能会创建无需创建的实例)


Java语言规范不仅不保证终结方法会被及时执行,而且根本就不保证他们会执行。当一个程序终止的时候,某些已经无法访问的对象上的终结方法却根本没有被执行,这是完全有可能的。结论:不应该依赖终结方法来更新重要的持久状态。


里氏替换原则:一个类型的任何重要属性也将适用于它的子类型。


信息隐藏(接口):
1、解除各模块之间的耦合关系,可以并发的开发、测试、修改
2、调节性能,可以很好确定哪个模块影响了性能
3、降低重构的难度和危险


公有类不应该暴露可变的域。但是,让公有类暴露不可变的域其危害比较小。


MAVEN远程中央仓库配置(中央仓库下载慢,就用镜像的仓库,例如本地maven中央仓库也可以):

<mirrors>        <mirror>            <id>ID</id>            <mirrorOf>MIRROR-OF</mirrorOf>            <name>NAME</name>            <url>地址</url>        </mirror></mirrors>