Effective Java 创建和销毁对象

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

一个boolean对象的静态工厂方法: 

 

public static Boolean valueOf(boolean b){
    return b?Boolean.TRUE : Boolean.FALSE;
}

静态工厂方法和构造器不同的

 

第一大优势:工厂方法有名称(这样可以让用户更容易使用,更易于阅读);

第二大优势:不必在每次调用它们的时候都创建一个新对象(有的场景需要,静态工厂方法能够为重复的调用返回相同的对象,可以是类实例受空,为Singleton,提升性能);

第三大优势:可以返回原返回类型的任何子类型的对象(比如要求通过接口来引用被返回的对象,而不是通过具体的实现类,提高可维护性,更加的灵活);

第四大优势:在创建参数化类型实例的时候,使代码变得更加简洁

比如创建一个hashmap代码为  :Map<String,List<String>> m = new HashMap<Stirng,List<String>>( );

提供一个静态工厂方法:

public static <k,v> HashMap<k,v> newInstance(){
  return new HashMap<k,v>();
}

这个时候创建hashmap代码就为:Map<String,List<String>> m = HashMap.newInstance();

 

缺点:如果类没有公有的或者受保护的构造方法就不能子类化(我们应该优先用复合,而不是继承)

总结:各有好处,通常应该优先用静态工厂方法,而不是第一反应就提供共有的构造 函数。

 

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

我觉得只有在这个情况下用构建器才更好:方法的参数要有多个(四个以上),而且是可选参数(有的必须传,有的可以不用传)

3.用私有构造器或者枚举类型强化Singleton属性

这个简单来说 就是单例设计模式(饿汉):

 

public class Singleton{
   private static final  Singleton INSTANCE = new Singleton();
    private Singleton(){};
    public static Singleton getInstance(){return INSTANCE;}
}

其实枚举已经成为实习Singleton的最佳方法。

 

4.通过私有构造器强化不可实例化的能力(注意,这样会使类不可子类化了)
5.避免创建不必要的对象(重用对象,如果对象是不可变的,它就始终被重用)

  要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱,看下面这段代码:

 

public static void main(String[]args){
    Long sum = 0L;//这里写成了Long而不是long
    for(long i=0;i<Integer.MAX_VALUE;++){
        sum +=i;//这里大约每次相加 都会构造出个Long实例
    }
    System.out.println(sum);
}

6.消除过期的引用
  栈先增长,然后收缩,那么从栈中弹出来的对象将不会被当作垃圾回收

 

 

//栈的pop方法
public Object pop(){
    if(size==0)
      throw new EmptyStackException();
    return elements[- -size]; //这里取出来element值,但是由于栈内部维护着对这些对象的过期引用,所有必须手动置为null,gc才会去回收了,所有 应在取值了加上一句   elements[size] == null;
}

内存泄漏的几个可能:(1)主要类是自己管理内存就应该警惕泄漏内存  (2)缓存,容易被遗忘掉 (可以使用weakHashMap) (3)监听器和其他回掉,客户端在api中注册了回调,却没有显示的取消注册(只报错弱引用,保存成weakHashMap中的键)。

 

7.避免使用终结方法(finalizer)
 通常是不可预测的,也是很危险的;终结方法线程的优先级比应用程序的优先级要低很多;Java语言规范不仅不保证终结方法会被及时执行,而且根本不保证他们会被执行;使用终结方法创建和销毁对象的性能特别差;(显示的终止方法模式,比如文件流的close()方法)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值