Effective Java第三版(一) ——用静态工厂代替构造器
此文做为《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第三版(一) ——用静态工厂代替构造器的更多相关文章
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- Effective Java 第三版——80. EXECUTORS, TASKS, STREAMS 优于线程
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——24. 优先考虑静态成员类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——12. 始终重写 toString 方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——14.考虑实现Comparable接口
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——18. 组合优于继承
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- WPF 跨界面调用程序
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (System.Threading.ThreadStart)delegate() { sE ...
- Asp UserInfoList 方法二
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserInfoList.a ...
- C#实现下载的几种方式举例
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- WPF媒体资源和图片资源寻址方式的杂谈
WPF提供一个封装和存取资源(resource)的机制,我们可将资源建立在应用程序的不同范围上.WPF中,资源定义的位置决定了该资源的可用范围.资源可以定义在如下范围中: (1)控件级:此时,资源只能 ...
- discuz电脑访问手机版域名怎么跳转到电脑版本
用discuz论坛访问手机版本的域名不会自动跳转到电脑版本,而是会跳转到域名+misc.php?mod=mobile体验很不好.现提供修改方法:打开论坛根目录找到文件./source/class/di ...
- web-dev-server配置
webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.j ...
- kafka 遇到的错
D:\cluster\kafka_2.->.\bin\windows\kafka-topics.bat --create --zookeeper localhost: --replication ...
- 【Windows10 IoT开发系列】开发人员模式设置
原文:[Windows10 IoT开发系列]开发人员模式设置 声明:本文转自微软Windows 开发人员中心(https://msdn.microsoft.com/library/windows/ ...
- Hadoop中一些重要概念简要总结
Hadoop是一个利用大规模计算机集群,可处理大量数据的分布式并行框架. Hadoop 官网 Hadoop的核心设计包括HDFS和MapReduce. HDFS HDFS(Hadoop Distrib ...
- jQuery仪表盘指示器动画插件 6种仪表样式
土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/ 使用HTML 创建Mac OS App 视频教程. 官方QQ群: (1)App实践出真知 434 ...