《Effective Java》—— 创建与销毁对象
本篇主要总结的是《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》—— 创建与销毁对象的更多相关文章
- [Effective Java] 创建和销毁对象篇
[Effective Java] 创建和销毁对象篇 1. 优先考虑用静态工厂方法代替构造器 优点: - 静态工厂方法相比于构造器,它们有名称 - 不需要每次在使用的时候创建一个对象 - 可以返回原返回 ...
- Effective Java 创建和销毁对象
<Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...
- Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器
//构建器抽象类,为不同类的实现提供 public interface Builder<T> { public T build(); } /** * @描述: 营养表 */ public ...
- JAVA创建和销毁对象
类静态方法取代构造方法创建对象 类静态方法有名称,可以通过名称说明返回的是什么类型的实例 可以控制是否需要新开辟内存空间 返回值是可以控制的 实体类属性非常多的时候使用build模式创建对象 单例实体 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- 和我一起学Effective Java之创建和销毁对象
前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象
- 《Effective Java》读书笔记(一)之创建和销毁对象
最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...
随机推荐
- <转>浅析长度为0的数组
前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该 ...
- Java 获取 Unix时间戳
unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒. 在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题. 但是,因为需求是需要int类 ...
- mysql5.6.34-debug Source distribution编译的几个错误
raspberrypi下编译mysql5.6 debug版源码. 1. 启动错误 和mysqld相关的文件及文件夹权限必须设置为mysql用户可读可写可执行!谨记! 2. gdb错误 root@: g ...
- BZOJ4350: 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
- 《UML大战需求分析》阅读笔记4
流程分析利器之二,状态机图. 状态机图也可以叫状态图,也是用来分析流程的,之前的活动图的主体是事件的行为,而状态机图主要描述的是事件的状态. 开始:实心圆点: 结束:点加环:(与活动图一样) 状态:圆 ...
- 【洛谷P3385】模板-负环
这道题普通的bfs spfa或者ballen ford会T 所以我们使用dfs spfa 原因在于,bfs sfpa中每个节点的入队次数不定,退出操作不及时,而dfs则不会 既然,我们需要找负环,那么 ...
- [LeetCode] 435 Non-overlapping Intervals
Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...
- VS2013安装部署项目
打开vs2013/2015菜单扩展和更新,查找Installer,找到Microsoft Visual Studio 2015 Installer Projects并下载安装. 安装之后模板中即有“安 ...
- hdu 4193 - Non-negative Partial Sums(滚动数列)
题意: 给定一个由n个整数组成的整数序列,可以滚动,滚动的意思就是前面k个数放到序列末尾去.问有几种滚动方法使得前面任意个数的和>=0. 思路: 先根据原来的数列求sum数组,找到最低点,然后再 ...
- JavaScript 学习笔记(一)
1.javascript中,值包括原始值和对象,原始值包括布尔值.数字.字符串.null和undefined,其他的值为对象. 原始值的特点:(1)按值进行比较:3===3> true; 'ab ...