前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Effective Java》—— 创建与销毁对象

《Effective Java》—— 创建与销毁对象

作者头像
用户1154259
发布2018-01-17 14:38:20
7430
发布2018-01-17 14:38:20
举报

本篇主要总结的是《Effecticve Java》中关于创建和销毁对象的内容。

比如:

  • 何时以及如何创建对象
  • 何时以及如何避免创建对象
  • 如何确保及时销毁
  • 如何管理对象销毁前的清理动作

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

使用静态工厂的优势:

  • 有名称
  • 不必每次调用的时候都创建一个新的对象
  • 返回原返回类型的任何子类型对象
  • 在创建参数化类型实例时,代码更加简洁。

使用静态工厂的缺点:

  • 类如果不包含公有的或者受保护的构造器,就不能被子类化
  • 与其他的静态方法实际上没有任何区别

举个例子:

代码语言:javascript
复制
public class Apple{
    public Apple(String type){}
    
    public static Apple newInstance(){
        return new Apple("qing");
    }
}

//使用的时候直接newInstance就可以
Apple.newInstance();

常用的静态工厂名称:valueOf,of,getInstance,newInstance,getType,newType.

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

如果参数很多,在使用的时候也会很繁琐。比如

代码语言:javascript
复制
new Person(name,age,address,tel,gender);

当参数大于三个的时候,就可以考虑使用构建器了,特别实在参数可选的时候。

代码语言:javascript
复制
public class Person{
    public Person name(String name){return this;}
    public Person age(String age){return this;}
    public Person gender(String gender){return this;}
    public Person tel(String tel){return this;}
}
//使用的时候可以这样用
(new Person()).name("xingoo").age(30).gender("male").tel(13333333333);

使用构建器的缺点就是代码会比较冗长。

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

第一种方式,是饿汉模式:

代码语言:javascript
复制
publci class Elvis{
    public static final Elvis INSTANCE = new Elvis();
    private Elvis(){}
    public void xxx(){}
}

另一种方式,属于懒汉模式:

代码语言:javascript
复制
public class Elvis{
    private static Elvis INSTANCE;
    private Elvis(){}
    public static Elvis getInstance(){
        if(INSTANCE == null)
            INSTANCE = new Elvis();
        return INSTANCE;
    }
    xxx
}

通过私有构造器强化不可实例化的能力

有一些比如工具类,是不想被实例化的,可以使用私有的构造方法,来避免实例化:

代码语言:javascript
复制
public class XXUtil{
    private XXUtil(){}
}

缺点是这样的类无法被子类化。

避免创建不必要的对象

尽量应该避免创建不必要的对象,比如:

代码语言:javascript
复制
String s = new String("xxx");

其实创建了两个字符串对象。

尽量优先使用long这种基本类型。

消除过期的对象引用

常见的是在栈操作,出栈操作并不意味着释放对象。

代码语言:javascript
复制
public Object pop(){
    if(size == 0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null;
    return result;
}

避免使用终结方法

finalizer方法是再垃圾回收的时候触发的,因此不能准确的知道终结方法调用的时间。因此最好是在try catch finally的时候释放对象。

这种释放对象的时机,叫做显示终止方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 考虑用静态工厂方法代替构造器
  • 遇到多个构造器参数时考虑使用构建器
  • 用私有构造器或者枚举类型强化Singleton属性
  • 通过私有构造器强化不可实例化的能力
  • 避免创建不必要的对象
  • 消除过期的对象引用
  • 避免使用终结方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档