Effective Java第一节
第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第一节的更多相关文章
- java第一节感受
第一节java课考试,感觉自从小学期和实习过了以后就等这个测试了,测试过了以后就是中秋节了,下周再上一节java又放国庆节了. 当时报软工的时候就早早地做好了心理准备,但是当亲身经历一遍后真的有了一种 ...
- Effective java第一章引言
菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...
- Java第一节课动手动脑
在第一节课的动手动脑中,主要解决四则运算问题. 首先第一个是出30道四则运算题目,在100以内.这个问题需要控制随机数生成的范围和结果的范围在100以内就可以. 第一次改进是3点:一为避免重复,二为定 ...
- Java第一节课考试
1 package kaoshi; import java.util.Scanner; public class ScoreInformation { Scanner input=new Scanne ...
- 零基础学Java第一节(语法格式、数据类型)
本篇文章是<零基础学Java>专栏的第一篇文章,从本篇文章开始,将会连更本专栏,带领大家将Java基础知识彻底学懂,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! ...
- java第一节课
1.安装 2.编写java程序 首先,新建一个文本文档:把后缀改成.java,然后起一个文件名,要是英文的,如:Hello. 然后,编辑,代码如下: class Hello { public stat ...
- EFFECTIVE JAVA 第一天 静态工厂方法
静态工厂方法:(这里指的是就是普通static方法),类可以通过静态工厂方法提供给它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做有几大优势. 在类的实现中使用了API的类被称为 ...
- effective java笔记之单例模式与序列化
单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...
- 大道至简第一章和java理论学时第一节。感受。
这周上了本学期的第一节java课程.课件上说了一些学习java的基本思想.举了个“愚公移山”的例子.这可能就像刚接触一门新的语言,来练习输出“HelloWorld”一样,已成惯例. “愚公移山”的这个 ...
随机推荐
- Java--异常与字符串
1.处理异常 try-catch以及try-catch-finally try{ //一些会抛出的异常 }catch(Exception e){ //处理该异常的代码块 }catch(Exceptio ...
- 06 - Django应用第三步
知识点 1) 编写urls 配合include()的URL查找过程 获取正则抓取的值并命名, 给url取名 2) 模板的编写 for循环的遍历 用点的方式执行函数, 不带括号 3) 视图函数的编写 H ...
- Agc003_E Sequential operations on Sequence
传送门 题目大意 $1,2...n,n$个数从小到大排列,有$m$此操作,每次操作给定一个参数$x$,将当且数列作为循环节无限地展开下去,再取前$x$个作为新的数列,求最终的数列每个数出现的次数. $ ...
- POJ3294Life Forms(广义后缀自动机)(后缀数组+二分+数状数组)
You may have wondered why most extraterrestrial life forms resemble humans, differing by superficial ...
- bzoj 4199: [Noi2015]品酒大会 后缀树
题目大意: 给定一个长为n的字符串,每个下标有一个权\(w_i\),定义下标\(i,j\)是r相似的仅当\(r \leq LCP(suf(i),suf(j))\)且这个相似的权为\(w_i,w_j\) ...
- codevs 3372 选学霸
3372 选学霸 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果 ...
- VS2008中宽字节和普通字节的使用
由于麻烦,所以并没有使用宽字节,留待以后.
- NSDictionary 用法
//Dictionary //不可变 //字典里面:是以键值对存放的 //字典存放顺序是无序的 //字典里面:value可以重复,但key不能重复 //字典里面:key一般用字符串表示,value可用 ...
- lvs+keepalived和haproxy+heartbeat区别
最近一直在看一些高可用性的负载均衡方案,当然那些f5之类的硬件设备是玩不起也接触不到了.只能看这些for free的开源方案. 目前使用比较多的就是标题中提到的这两者,其实lvs和haproxy都是实 ...
- RPM包及其管理 rpm命令
一.什么是RPMRPM:RedHat Package Manager //红帽包管理如果Linux发行版本是redhat .redflag .centos .fedora .suse等或者衍生 ...