整理一下自己effective java
创建 和销毁对象
- 静态工厂方法代替构造器
优点
- 静态工厂方法有名字 ,是客户端代码更容易阅读
- 不必每次都创建一个新对象
- 可以返回任意子类型的对象
- 返回的对象可以在每次调用下发生变化取决于参数值(这应该是指内部的参数,而不是说的传递的参数)
- 方法返回的具体的类可以在编写该静态方法时不存在(第三条)
缺点
- 类中必须有公共构造器或者受保护的构造器
- 而是很难找 (名字任意的问题)所以用常用的一些关键字
from of valueof instance create getType newType
场景 - 当一个类需要有多个带有相同的签名的构造器时,就用静态工厂替代
- 不想重复创建某个对象
-
遇到多个构造器参数的时候用建造者模式(Builder)
构造器多个参数 导致创建错误(容易输错,且传了许多没意义的参数)
javabean模式中(get set) 导致构造过程不一致 ,使类不可能不变
而builder 模式中就没有这两种问题 -
用私有构造器或枚举类型强化单列
Singleton通常表示一个无状态对象,函数,本质唯一的系统组件。
两种实现
- 构造器私有 有一个
private static final
修饰的实例然后提供一个静态的共有返回方法、 - 枚举类型实现
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){
}
}
- 通过私有构造器强化不可实例的类
就是说通过私有构造器修饰工具类
-
优先考虑依赖注入引用资源
-
创建不必要的对象
不可变的对象指域不会发生变化(用静态工厂方法创建)
比如正则里的Pattern对象 ,一旦创建就是不变的。而且耗费较高,因此要缓存起来
优先使用基本类型,当心无意识自动装箱
-
消除过期的对象引用
例子
手写的一个栈 (用一个Object[] 数组来存储对象,一个int 的值管理 栈顶)
当栈再收缩时 应该 置为null 否则内存泄漏(但类在自己管理内存的时候)
weakhashmap 一个对象的生命周期的由外键的引用决定时就可用
接口回调 和监听器 产生的内存泄漏 -
避免使用终结方法 和清除方法
-
try - with -resource 优先于 try - finally
try(Inputstram in =new FileInputStream(path);
OutputStream out = new FileOutPutStream()){
byte[] buf = new byte[BUFFER_SIZE];
int n;
while(n = in.read(buf) >= 0){
out.write(buf,0,n);
}
}
网友评论