此文做为《Effective Java》系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!《Effective Java》第三版较之上一版新增了对Java7、8、9的一些新特性的条目。而条目的概念可以理解为武功秘籍中的一招一式,学完了每一招一式,就是神功大成之时。第三版在第二版的基础上新增了一些条目数,达到了90条。书就介绍到这里,下面介绍第一条——用静态工厂代替构造器。

  对于创建对象,最熟悉的莫过于使用new关键字调用对象提供的构造器来创建对象,而此书的第一条告诉我们,类可以提供一个公有的静态工厂方法来创建对象。(ps:这里的静态工厂方法并不直接对应设计模式中的工厂模式,请大家不要对号入座),首先我们来看一看静态工厂方法的优点,也就是为什么我们要使用它。

五大优点:

一.它有名称。这样说是因为,构造器必须与类同名,一个类无论有多少构造器,它们的名字都是一样的,即和类同名。但是静态工厂方法不同,它可以有具体意义的名称,例如一个User类可以有一个adminUser()方法来提供一个管理员用户。

二.不必在每次调用它们的时候都创建一个新对象。如以下代码,可以有效的避免创建不必要的重复对象。

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}

三.可以返回原返回类型的任何子类型,主要适用于基于接口的框架。

四.所返回的对象可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。

五.方法返回的对象所属类,在编写包含该静态工厂方法的类时可以不存在。

两个缺点:

一.类如果不包含公有的或者受保护的构造器,就不能被子类化。

二.程序员很难发现它。

总结:静态工厂方法与构造器各有优缺点,我们需要理解各自的长处,以便更加合适的使用。相对来讲静态工厂方法能够提供更加强大的功能,当我们做为服务方时静态工厂方法无疑能使我们提供的服务更加灵活多变和强大。而对于它的两个缺点,尤其是第二缺点完全可以通过命名的规范化及良好的注释来规避这一缺点。

附:

静态方法常用命名:

  • from 类型转换方法,如:Date date = Date.from(Instant.now());
  • of 聚合方法,

  如Set<ResolverStyle> styles = EnumSet.of(ResolverStyle.LENIENT,ResolverStyle.SMART,ResolverStyle.STRICT);
  • valueOf 比from和of更繁琐的一种替代方法,如:BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
  • instance或者getInstance 常用作单例模式的实现;
  • create或者newInstance 每次调用返回新的实例;

Effective Java第三版(一) ——用静态工厂代替构造器的更多相关文章

  1. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  2. Effective Java 第三版——80. EXECUTORS, TASKS, STREAMS 优于线程

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  3. Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. Effective Java 第三版——24. 优先考虑静态成员类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  5. Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Effective Java 第三版——12. 始终重写 toString 方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. Effective Java 第三版——14.考虑实现Comparable接口

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. Effective Java 第三版——18. 组合优于继承

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. 原生Js监听普通dom尺寸变化

    原生Js监听普通dom尺寸变化 具体做法有以下几种: 初始化项目后,轮询,反复查看 dom 尺寸是否变化,这种一听就感觉不好,开销太大. 监听元素的滚动事件,在 目标 dom 里面包裹一个同等大小的 ...

  2. .Net DateTime跨时区相关问题

    项目:.Net CS结构,WCF通信,MySql存储. 场景:客户端(UTC+07:00)获取本地时间(DateTime对象)2017-01-17 15:20:12,通过WCF(http)传输至服务端 ...

  3. SQLite Expert Professional 打开加密SQLite数据库

    原文 SQLite Expert Professional 打开加密数据库 (已修改) 版本:sqlite expert professional 4.2.0.739 (x86) 目的:用SQLite ...

  4. RxJava入门优秀博客推荐

    RxJava用了快半年了,现在越来越离不开这个库,从使用到逐渐接触它的背后实现,突然想写点什么关于RxJava的内容.在酝酿如何组织内容的时候,就去看看自己关于RxJava的收藏,发现满满的干货! 1 ...

  5. Android零基础入门第83节:Activity间数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递. 一.常用数据类型 在前面几节我们只学习了一些常用类型的数据传 ...

  6. spring.net的简单使用(四)对象属性注入

    创建了对象,如果是简单对象就到此为止,如果是复杂对象,则需要为它的属性赋值. 属性赋值有两种方法:属性注入和构造器注入. 一.属性注入 在object节点下使用property就是属性注入,如下: & ...

  7. 常用json解析库比较及选择 fastjson & gson

    一.常用json解析库比较及选择 1.简介 fastjson和gson是目前比较常用的json解析库,并且现在我们项目代码中,也在使用这两个解析库. fastjson 是由阿里开发的,号称是处理jso ...

  8. delphi如何输出当前堆栈

    想实现,输出当前运行的堆栈,有会的吗?给点思路 方法很多,参考: https://bitbucket.org/shadow_cs/delphi-leakcheck/ 的 https://bitbuck ...

  9. JavaWeb实现上传文件

    需要 commons-io与commons-fileupload 首先在jsp中创建一下布局 <%@ page contentType="text/html;charset=UTF-8 ...

  10. 95+强悍的jQuery图形效果插件

    现在的网站越来越离不开图形,好的图像效果能让你的网站增色不少.通过JQuery图形效果插件可以很容易的给你的网站添加一些很酷的效果. 使用JQuery插件其实比想象的要容易很多,效果也超乎想象.在本文 ...