[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. CSharp调用C++编写的DLL的方法

    自己比较懒,有的时候想写点东西,但由于文笔不行.技术不行也就没有怎么写.经常是用到什么.学习什么的时候,简单写点,权当是个学习笔记.上博客的次数也很少,有人给我留言也是没有怎么及时的回复,深感抱歉! ...

  2. div鼠标悬停,子元素上移,鼠标移出,子元素下移动画。

    HTML: <div class="edt_title" > <div id="edt_title"> <p class=&quo ...

  3. MVVM及框架的双向绑定

    MVVM由以下三个内容组成 View:视图模板 Model:数据模型 ViewModel:作为桥梁负责沟通View和Model,自动渲染模板 在JQuery时期,如果需要刷新UI时,需要先取到对应的D ...

  4. DHTML---HTML5

    1. HTML概述 网页是网站的表现层,各种编程语言(如Java)构成后台的逻辑,我们将后台逻辑做好然后通过页面表达.同时通过网页来与后台进行交互.而Html是我们做网页的基础,由浏览器来解析. 1. ...

  5. JNI 和 socket api

    1.JavaVM 和 JNIEnvJNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程 ...

  6. Java实现双向冒泡排序

    public class BubbleSort_Two { public static void bubbleSort_Two(int[] list){ //j在最外层定义 boolean needN ...

  7. stl之std::remove_copy

    template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy (Inpu ...

  8. JavaScript运算操作符

    1. "+" (1)数学运算 var a = 1 + 1; console.log(a); //输出值为2 (2)字符串连接 (任何数据类型加字符串都等于 字符串) var ini ...

  9. 小a的强迫症(组合数学)

    问题描述: 小a是一名强迫症患者,现在他要给一群带颜色的珠子排成一列,现在有N种颜色,其中第i种颜色的柱子有num(i)个.要求排列中第i种颜色珠子的最后一个珠子,一定要排在第i+1种颜色的最后一个珠 ...

  10. C++ string和int相互转换

    首先需要C++ 11的支持 打开devC++,点击tools,点击编译环境,然后出现的框第一个勾选,输入-std=c++11即可 然后使用 to_string() 和 atoi() 就可以轻松实现其相 ...