第1条:考虑用静态工厂方法代替构造器

首先清楚什么是静态工厂方法?

静态工厂方法说白了就是在创建对象的时候,不是自己使用new关键字创建的,而是使用静态方法来对外提供自身的实例的方法。

比如:

Fragment fragment=MyFragment.newIntance();

Calendae calendae=Calendae.getIntance();

Integer integer=Integer.valueOf(“3”);

New关键字代表着程序执行到这里的时候,JVM会创建一个内存空间,然后调用构造函数来初始化成员变量,最终把引用返回给调用方。

我自己的理解是:类似使用单利模式进行创建,直接调用创建对象的那个方法。

静态工厂方法与构造器不同的四大优势:

第一大优势,它们有名称。

我们都知道,在实例化类的时候,往往会调用类中的构造函数,构造函数的名称是相同的,只有参数不同,参数可以有顺序,类型的不同,从而是整个构造方法不同。这给我们带来的麻烦就是,很多时候我们会不知道要使用哪个或者使用这个构造函数往往需要填写不需要的数据,数量少还好说,万一数量多了,数据就不受控制了。这个时候,静态工厂方法的优势就体现出来了,直接使用名称的形式简单明了。

第二大优势,不必每次调用他们的时候都创建一个新对象。

这里可以使用单利的思维思考,因为单利的目的就是为了不重复创建对象。它可以每次都返回一个对象,进行重复使用。在很多情况下,这种方式可以让开发人员清楚的把控创建的对象,有利于开发与维护。还有利于性能的提升。

第三大优势,它们可以返回原类型的任何子类型的对象。

在设计模式中的基本原则之一------->里氏替换,就是说子类能替换父类

显然,构造方法只能返回确切的自身类型,而静态工厂能更加灵活,可以根据需要方便的返回它的任何子类类型的实例。

例如:

以上代码可以清楚的发现,使用Person可以返回Person的实例,也可以使用子类返回Person的实例。

第四大优势,在创建参数化类型实例的时候,使得代码更加简洁。

这个优势我觉得没有多大的解释意义,如下代码

Map<String.List<String>> map=new HashMap<String,List<String>>();

这个实例需要创建的时候,需要写那么冗长,很多时候吃不消,然后就有了如下的设计

Public static <K,V> HashMap<K,V> newInstance(){

Return new HashMap<K,V>();

}

使用的时候就直接使用下面这个就简洁多了。

Map<String,List<String>> map=HashMap.newInstance();

所以我觉得用起来方便,但是它们内部把之前要做的步骤都做了,展现的是我们看到的,这个好处就显而易见了。

静态共仓方法的缺点:

第一缺点:类如果不含有公有的或者受保护的构造器,就不能被子类化:

这句话的理解是:就是说在创建静态工厂的时候,使用私有的关键词修饰了之后,子类就实例化不了父类的实例。

第二个缺点:它们与其他静态方法实际上没有任何区别。

总结:静态工厂与构造器各有千秋,我们理解了它们之后,需要使用各自的长处,而不是一贯的使用构造方法,忘记静态工厂方法。

Effective Java第一节的更多相关文章

  1. java第一节感受

    第一节java课考试,感觉自从小学期和实习过了以后就等这个测试了,测试过了以后就是中秋节了,下周再上一节java又放国庆节了. 当时报软工的时候就早早地做好了心理准备,但是当亲身经历一遍后真的有了一种 ...

  2. Effective java第一章引言

    菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...

  3. Java第一节课动手动脑

    在第一节课的动手动脑中,主要解决四则运算问题. 首先第一个是出30道四则运算题目,在100以内.这个问题需要控制随机数生成的范围和结果的范围在100以内就可以. 第一次改进是3点:一为避免重复,二为定 ...

  4. Java第一节课考试

    1 package kaoshi; import java.util.Scanner; public class ScoreInformation { Scanner input=new Scanne ...

  5. 零基础学Java第一节(语法格式、数据类型)

    本篇文章是<零基础学Java>专栏的第一篇文章,从本篇文章开始,将会连更本专栏,带领大家将Java基础知识彻底学懂,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! ...

  6. java第一节课

    1.安装 2.编写java程序 首先,新建一个文本文档:把后缀改成.java,然后起一个文件名,要是英文的,如:Hello. 然后,编辑,代码如下: class Hello { public stat ...

  7. EFFECTIVE JAVA 第一天 静态工厂方法

    静态工厂方法:(这里指的是就是普通static方法),类可以通过静态工厂方法提供给它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做有几大优势. 在类的实现中使用了API的类被称为 ...

  8. effective java笔记之单例模式与序列化

    单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...

  9. 大道至简第一章和java理论学时第一节。感受。

    这周上了本学期的第一节java课程.课件上说了一些学习java的基本思想.举了个“愚公移山”的例子.这可能就像刚接触一门新的语言,来练习输出“HelloWorld”一样,已成惯例. “愚公移山”的这个 ...

随机推荐

  1. type为number的input标签输入小数的方法

    纠结了一段时间都没找出方法,最后灵光一现想出这个方法,没想到测试下果然成功了! 看目前网上几乎很难找到相对应的解决方法,所以这里分享出来,如果有更佳方法欢迎提出. 方法如下: <input ty ...

  2. python-Django监控系统二次开发Nagios

    1.Nagios安装 yum install -y nagios.i686 yum install -y nagios-plugins-all.i686 安装完后会在apache的配置文件目录下/et ...

  3. FFMPEG内存操作(二)从内存中读取数及数据格式的转换

    相关博客列表: FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 在雷神 ...

  4. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

  5. CF1060B:Maximum Sum of Digits

    我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html 题目传送门:http://codeforces.com/problemset/problem/ ...

  6. java web项目创建

    https://www.cnblogs.com/kangjianwei101/p/5621738.html

  7. 通过DBCC整理Sqlserver数据库表索引碎片

    昨天检查了一张效率极慢的表,两年多没有维护,逻辑扫描碎片高达99.%,于是开始对这个表进行重点跟踪和记录日志.今天用DBCC SHOWCONTIG WITH TABLERESULTS 命令检查了一下所 ...

  8. C++模板特化编程

    在C++中,模板特化是除了类之外的一种封装变化的方法.模板特化可以通过编译器来对不同的模板参数生成不同的代码. 模板特化通常以模板结构体作为载体.常用技法包括:类型定义.静态成员常量定义和静态成员函数 ...

  9. linux日常管理-vmstat命令

    系统负载用w查看.是什么原因造成了系统负载.查看系统负载状态 命令:vmstat vmstat就查看一次 vmstat 1 每秒钟更新一次.按ctrl+c取消. vmstat 1 5 每秒钟更新一次, ...

  10. T-SQL操作XML 数据类型方法 "modify" 的参数 1 必须是字符串文字。

    ----删除关键字的同时也清理AP表中所有关联这个ID的数据 create trigger Trg_UpdateAppWordOnDelKeyWord on [dbo].[tbl_KeyWord] f ...