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

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

优点:
- 静态工厂方法相比于构造器,它们有名称
- 不需要每次在使用的时候创建一个对象
- 可以返回原返回类型的任何子类型的对象
- 在创建参数化是来的时候,代码更加简洁

缺点:
- 不能被子类化(因为鼓励程序使用复合,而不是继承)
- 与其他的静态方法实际上没有任何区别(想要查明如何实例化一个类比较困难)

常用静态工厂方法名称:
- valueOf(类型转换方法)
- of
- getInstance(singleton)
- newInstance(每次实例化出来的都和其他实例不同)
- getType
- newType


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

常用模式:
- 重叠构造器(太繁琐,要提供所有参数数量的构造器)
- JavaBeans模式(无参构造函数,然后使用setter方法)(线程安全问题)
- Builder模式

该类构造函数为私有,但提供一个公有的构造函数public static class Builder所有参数都有自己的public函数并返回this,且默认值都放在Builder类中,new Builder()后可以链式调用,最后调用无参函数build() return new xxx();

例如NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build()


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

实现Singleton的三种方式:
1. 构造器私有
导出公有静态成员(public static final Elvis INSTANCE = new Elvis()

  1. 公有静态工厂方法
    public static Elvis getInstance() { return INSTANCE },为了防止反序列化,需要声明所有实例域都是瞬时(transient)的,且要提供private Object readResolve() { return INSTANCE;}方法。

  2. 单个元素的枚举类型
    可序列化,且绝对防止多次实例化,包括防止反射攻击,是Singleton的最佳方法

public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {...}
}

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

工具类不希望被实例化的方式:

  • 做成抽象类,防止实例化,但是会被误以为是需要继承才可使用
  • 构造器设为私有,并添加注释(推荐)

5. 避免创建不必要的对象

对于在同一台虚拟机中运行的代码,只要包含相同字符串字面常量,该对象就会被重用。

要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。

通过维护自己的对象池来避免创建对象并不是一种好的做法,除非池中的对象是非常重量级的。

当你应该重用现有对象的时候,请不要创建新的对象。但要注意“保护性拷贝”


6. 消除过期的对象引用

内存泄漏常见来源:
- 管理内存不当
- 没有清除过期缓存
- 监听器和其他回调


7. 避免使用终结方法

终结方法的缺点在于不能保证会被及时地执行。(JVM会延迟执行终结方法)
依赖终结方法来释放共享资源上的永久锁,容易让整个分布式系统垮掉。
使用终结方法会有很严重的性能损失。

使用显示的终止方法,配合try-finally使用(例如.close()

尽量不要使用终结方法,如果用的话一定要记住调用super.finalize


[Effective Java] 创建和销毁对象篇的更多相关文章

  1. Effective Java 创建和销毁对象

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

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

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

  3. JAVA创建和销毁对象

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

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

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

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

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

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

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

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

    本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑 ...

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

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

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

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

随机推荐

  1. <body> 中的 JavaScript

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. 在react中实现CSS模块化

    react中使用普通的css样式表会造成作用域的冲突,css定义的样式的作用域是全局,在Vue 中我们还可以使用scope来定义作用域,但是在react中并没有指令一说,所以只能另辟蹊径了.下面我将简 ...

  3. EventBus 基础篇

    最近在研究RxJava ,突然想起了事件分发另一个强大的框架Eventbus ,并且项目经常用到,特意整理了下. what is Eventbus? 官方的解释为: EventBus is a pub ...

  4. HTML简介及基本标记

    HTML简介 HTML是Hypertext Markup Language的英文缩写,即超文本标记语言 使用 HTML 语言可以: 控制页面和内容的外观 插入的链接检索联机信息 创建表单,收集用户的信 ...

  5. 并发编程之多线程基础-Thread和Runnable的区别及联系(二)

    上篇文章讲述了创建线程的常用方式 本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系 联系: ▶Thread类实现了Runable接口. ▶都需要重写里面Run方法. 区别: ...

  6. JS中对象继承方式

    JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/28 ...

  7. 【HDOJ 1269】迷宫城堡(tarjan模板题)

    Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若 ...

  8. java.util.ArrayList,java.util.LinkedList,java.util.Vector的区别,使用场合.

    下图是Collection的类继承图 从图中可以看出:Vector.ArrayList.LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的 ...

  9. 汉化manjaro下的火狐浏览器

    1.下载 汉化包 sudo pacman -S firefox-i18n-zh-cn 2.查看add-ons下的language选项有没有已安装的包 3.在浏览器的地址栏输入 搜索intl.local ...

  10. [转]win7下修改C盘USERS文件下的名称

    Win7下C:\Users\Cortana以账户名称命名的系统文件夹用户名的修改   Win7下C:\Users\Cortana以账户名称命名的系统文件夹用户名的修改 Win7下C:\Users\Co ...