[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. PC Android IOS资料同步更新

    在程序发布后,特别是IOS版本,想替换里边的内容,重新发布版本很是麻烦.我们就可以动态用AssetBundle更新内容. 如果是自定义二进制文件,先要改为“.Bytes”后缀的文件,Unity会把这个 ...

  2. 配置两台Azure服务器,一台加入另一台的ad域加入不进去的问题

    AD服务器   10.0.0.4 数据库服务器    10.0.0.5 将数据库服务器加入到AD域中,需要将Azure的DNS改成10.0.0.4 Copy一下

  3. 卸载MySQL以及重装卡到Start Services的解决办法(亲测有效,刚重装成功)

    卸载MySQL以及重装卡到Start Services的解决办法 重装系统永远是个好办法,但是对于我们程序员来说只要一想到电脑上的环境变量和其他的配置就蔫了.所以这一条就当作是废话吧. 一般来说装My ...

  4. Web中的中文参数乱码

    中文参数乱码    1 get方式传参,中文乱码        修改tomcat中的配置server.xml        在修改端口的标签中添加属性URIEncoding="XXX&quo ...

  5. IOS 浅谈闭包block的使用

    前言:对于ios初学者,block通常用于逆向传值,遍历等,会使用,但是可能心虚,会感觉block很神秘,那么下面就一起来揭开它的面纱吧. ps: 下面重点讲叙了闭包的概念,常用的语法,以及访问变量, ...

  6. django写一个简单的登陆注册

    要写这个,前提还是需要知道三个知识: 一个是urls.py,它是写我们的路由关系的,之前我写了通过wsgiref写一个简单的服务端,也用到了路由,就是 请求过来的url和视图函数的对应关系. 二是就是 ...

  7. 重写Alert和confirm方法去除地址显示

    //重写alert方法,去掉地址显示window.alert = function(name){var iframe = document.createElement("IFRAME&quo ...

  8. 第十四届浙江财经大学程序设计竞赛重现赛--A-A Sad Story

    链接:https://www.nowcoder.com/acm/contest/89/A 来源:牛客网 1.题目描述 The Great Wall story of Meng Jiangnv’s Bi ...

  9. python3.5怎么打包编译

    问题:用Python开发的小工具有时需要编译打包为Windows(*.exe).Mac等操作系统下的可执行性文件以供非程序员使用. 解决方案: 一.py2exe 目前只支持到Python3.4,暂不支 ...

  10. 上传文件到阿里云linux服务器

    在“运行”中输入cmd,打开控制台,切换到刚才Putty的安装目录下,我的是E:\Putty,然后输入pscp命令,我们需要这个命令来实现文件的上传.如下图所示,命令格式为: pscp D:\recy ...