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

比如:

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

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

使用静态工厂的优势:

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

使用静态工厂的缺点:

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

举个例子:

public class Apple{
public Apple(String type){} public static Apple newInstance(){
return new Apple("qing");
}
} //使用的时候直接newInstance就可以
Apple.newInstance();

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

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

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

new Person(name,age,address,tel,gender);

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

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属性

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

publci class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis(){}
public void xxx(){}
}

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

public class Elvis{
private static Elvis INSTANCE;
private Elvis(){}
public static Elvis getInstance(){
if(INSTANCE == null)
INSTANCE = new Elvis();
return INSTANCE;
}
xxx
}

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

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

public class XXUtil{
private XXUtil(){}
}

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

避免创建不必要的对象

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

String s = new String("xxx");

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

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

消除过期的对象引用

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

public Object pop(){
if(size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null;
return result;
}

避免使用终结方法

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

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

《Effective Java》—— 创建与销毁对象的更多相关文章

  1. [Effective Java] 创建和销毁对象篇

    [Effective Java] 创建和销毁对象篇 1. 优先考虑用静态工厂方法代替构造器 优点: - 静态工厂方法相比于构造器,它们有名称 - 不需要每次在使用的时候创建一个对象 - 可以返回原返回 ...

  2. Effective Java 创建和销毁对象

    <Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...

  3. Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器

    //构建器抽象类,为不同类的实现提供 public interface Builder<T> { public T build(); } /** * @描述: 营养表 */ public ...

  4. JAVA创建和销毁对象

    类静态方法取代构造方法创建对象 类静态方法有名称,可以通过名称说明返回的是什么类型的实例 可以控制是否需要新开辟内存空间 返回值是可以控制的 实体类属性非常多的时候使用build模式创建对象 单例实体 ...

  5. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  6. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  7. 和我一起学Effective Java之创建和销毁对象

    前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...

  8. Effective Java(1)-创建和销毁对象

    Effective Java(1)-创建和销毁对象

  9. 《Effective Java》读书笔记(一)之创建和销毁对象

    最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...

随机推荐

  1. PhpStorm破解教程

    http://www.cnblogs.com/buyucoder/p/5291771.html

  2. 一行css代码调试中学到的javascript知识,很有意思

    现在到处都是JavaScript,每天都能知道点新东西.一旦你入了门,你总能从这里或是那里领悟到很多知识.今天我想分享Addy Osmani的一行代码 ,这行代码对于你调试你的CSS是很有用的.为了可 ...

  3. Git常用

    创建本地库 mkdir [dirname] cd [dirname] git init 1.创建项目目录 2.进入目录 3.git初始化 [dirname]为自己取的文件夹名字,例如mkdir myd ...

  4. 用Python写爬虫爬取58同城二手交易数据

    爬了14W数据,存入Mongodb,用Charts库展示统计结果,这里展示一个示意 模块1 获取分类url列表 from bs4 import BeautifulSoup import request ...

  5. 一款免费支持PDF、word、excel、PPT、jpeg之间互转线上软件

    偶然发现的一款免费支持PDF.word.excel.PPT.jpeg之间互转,支持合并pdf.加密解密PDF的线上软件,首先声明,不是广告党,我自己试用过,确实是目前我用过最好用的,如果有朋友有更好的 ...

  6. If you really want to compile without asm, configure with --disable-asm.

    真是一个奇葩问题,对我来说是的,完全不知道是什么意思,但是他就是出现了. 找到了一个相关问题http://trac.ffmpeg.org/wiki/How%20to%20quickly%20compi ...

  7. C#常用代码集合(1)

    引用自james li的博客,地址:http://www.cnblogs.com/JamesLi2015/p/3147986.html   1 读取操作系统和CLR的版本   OperatingSys ...

  8. ADO.NET Entity Framework

    ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案, 早期被称为 ObjectSpace,现已经包含在 V ...

  9. jquery ajax post 中文乱码解决

    jquery ajax post 方式默认传递的是UFT-8字符,即使页面设置了gbk编码也无效.字符传到后台时如果后台设置的gbk或者其他编码,就会出现乱码.解决很容易,将后台页面设置成UTF-8编 ...

  10. Xamarin.Forms.Platform.Perspex, Xamarin Forms 的 Perspex(号称下一代WPF) 实现

    Perspex, 跨平台的UI框架,加上Xamarin Forms的跨平台的中间层,这样同一套代码就可跨几乎所有已知平台,这其中包括旧版Windows, Linux及Mac OS. 目前,基本控件可显 ...