[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. Android学习笔记_33_Widget时钟(MetaData)

    Widgets在文档docs\guide\topics\appwidgets\index.html下 Android中AppWidget的分析与应用:AppWidgetProvider 一.在 And ...

  2. mac启动springboot失败,8080端口被占用,mac命令行关闭端口

    如下图,idea启动springboot失败,8080端口被占用 Error starting ApplicationContext. To display the conditions report ...

  3. leetcode笔记(七)529. Minesweeper

    题目描述 Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix repres ...

  4. Cygwin安装篇,windows平台上运行的类UNIX模拟环境

    1.虚拟光驱的安装 虚拟光驱下载 一路下一步,不再阐述,这些广告选项不要选 2.安装文档,双击ISO文档 ISO下载地址 链接:http://pan.baidu.com/s/1miFVCYO 密码:z ...

  5. js实现前端的搜索历史记录

    最近在对接前台页面(WEB端)时,产品要求需记录下客户的搜索记录,我们是前后台完全分离的项目,根本不能保存的session域中,没办法,虽然作为后台开发,遇到需求就自己研究了一通,先看一下最终效果图, ...

  6. [转]Nginx伪静态配置和常用Rewrite伪静态规则集锦

    Nginx伪静态配置和常用Rewrite伪静态规则集锦 作者: 字体:[增加 减小] 类型:转载 时间:2014-06-10 我要评论 伪静态是一种可以把文件后缀改成任何可能的一种方法,如果我想把ph ...

  7. JS基础知识-01

    01-浅谈前端发展史 第一阶段:C/S(client server)->B/S(browser server) 网页制作 技术栈:PhotoShop.HTML.CSS 第二阶段:从静态到动态,从 ...

  8. Python3爬虫(五)解析库的使用之XPath

    Infi-chu: http://www.cnblogs.com/Infi-chu/ XPath: 全称是 XML Path Language,XML路径语言,它是一门在XML文档中和HTML文档中查 ...

  9. go学习笔记-语言基础

    语言基础 结构 基础组成: 包声明 引入包 函数 变量 语句 & 表达式 注释 程序 在开始编写应用之前,我们先从最基本的程序开始,在学习大部分语言之前,都会编写一个可以输出hello wor ...

  10. (数据科学学习手札20)主成分分析原理推导&Python自编函数实现

    主成分分析(principal component analysis,简称PCA)是一种经典且简单的机器学习算法,其主要目的是用较少的变量去解释原来资料中的大部分变异,期望能将现有的众多相关性很高的变 ...