《Effective Java》 读书笔记(一) 使用静态构造方法代替传统构造函数
对象的创建与销毁
ITEM1 使用静态工厂方法代替构造函数
传统的新建一个对象的方法是通过构造函数:
Foo foo =new Foo();
一个类也可以提供一个静态方法产生一个对象:
Boolean flag=Boolean.valueOf(b);
这两种方法都可以产生一个对象,但是什么时候应该使用哪种方法?两种方法分别有什么优点和缺点呢?
对于使用静态方法产生一个对象来说:
1.静态方法可以自定义方法名
静态方法更能够通过方法名描述所返回的对象
有时候一个类包含多个构造函数,并且每个构造函数所产生的对象会稍微有些差别。那么使用静态方法产生一个对象是一个非常好的选择。
看以下代码:
BigInteger bigIntege=new BigInteger(int,int,Random);
如果不查看这个构造函数的文档,我们并不知道这个构造函数会返回一个具体什么样的BigInteger给我们。
但是:
BigInteger bigInteger=BigInteger.probablePrime(int,Random);
就能直接看出来,这样会产生一个素数对象。
PS:别过度使用静态方法,例如:
public class Base64{
public Base64 initByString();
public Base64 initByByte();
public Base64 initByInteger();
}
适当使用重载能让代码更简洁,也更方便使用。
2.静态方法不需要在每次被调用的时候都必须产生一个新的对象
就像众所周知的Integer等包装类,他们都含有自动装箱的功能:
Boolean flag=Boolean.valueOf(boolean);
这种静态方法对于创建比较大型的对象来说,可以很大程度的节省开销。
并且这种静态方法能够保证用户在任何时候,都是使用的同一个对象
3.静态方法可以返回原类型的任何子类型对象
这种方法基于接口实现的框架,可以用于隐藏API的具体实现。
在jdk1.8之前,接口不能定义静态方法,可以按照惯例定义一个不可实例化的Types的静态工厂方法用于返回对象。
就好像Java集合中的Collections一样。
4.静态方法可以根据参数返回不同的子对象
类似情况就像Integer的自动装箱,EnumSet等,会根据参数的大小,返回不同大小的对象一样。
5.静态方法返回的对象,在编写类时不是必须存在的
就像Java的数据库连接API JDBC一样,客户端只需要一个接口即可编写代码,而具体的实现在数据库的服务上。这样便实现了解耦操作
缺点:
1.如果类不含有公有或者受保护的构造函数,就不能被继承
刚开始看这段话,翻译过来比较生成,百度上也大多数直接翻译过来,并没有做过多的解释。
说说我的理解吧:
看下面一段代码:
public class Student {
/**
* 静态工厂方法构造对象
*/
public static Student valueOf(){
return new Student();
}
/**
* 隐藏原本的构造函数
*/
private Student(){}
}
由于Student类的构造函数被定义为private的了。
因此:Student类就不能被作为父类被继承了。
2.对于编码人员来说,很难找到这个静态工厂构造方法具体是哪个.
比如有时候它可能叫valueOf,getInstance,from,of,create,newInstance,getType等。
程序员必须大概找找这个类的所有方法才能知道具体的静态构造函数是哪个。
总之,通常来说使用静态方法的构造函数是一个更好的选择,感悟并理解使用静态方法构造函数的优点,并在日常工作中使用它
《Effective Java》 读书笔记(一) 使用静态构造方法代替传统构造函数的更多相关文章
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...
- Effective Java读书笔记--类和接口
1.使类和成员的可访问性最小化不指定访问级别,就是包私有.protected = 包私有 + 子类一般private不会被访问到,如果实现了Serializable,可能会泄露.反射.final集合或 ...
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
- Effective Java 读书笔记(五):Lambda和Stream
1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...
- Effective Java 读书笔记(一):创建和销毁对象
1 构造器 => 静态工厂方法 (1)优势 静态工厂方法有名字 静态工厂方法不必在每次被调用时都产生一个新的对象 静态工厂方法能返回原返回类型的任意子类型的对象 静态工厂方法根据调用时传入的不同 ...
随机推荐
- python beautiful soup
官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 使用前需要先安装模块,并安装解析器 pip install beautif ...
- js中对于数组的操作
let myArray=[11,22,33]; console.log('原数组:',myArray); myArray.push(44,55); console.log('用push在数组后面插入元 ...
- jQuery查找节点(选择器)
jQuery通过选择器来完成节点的查找: 1.基本选择器: ①通用/所有的选择器:$("*") //使用*号来表示. ②:标签选择器:$("标签名(div)") ...
- CSS定位与布局
我们在编写网页代码时,首先应该做的就是设计好页面的布局形式,然后再往里面填充内容.网页布局的好与坏,直接决定了网页最终的展示效果.PC端常见的网页布局形式有两列布局.三列布局等.在CSS中,我们通常使 ...
- CSS 预处理语言之 Scss 篇
简介 1. Sass 和 Scss Sass 和 Scss 其实是同一种东西,我们平时都称之为 Sass:Scss 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强 ...
- (转) websocket 和 socket 剖析
Socket 与 WebSocket 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文 ...
- Nullable Reference Types 可空引用类型
在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...
- Butter Knife
Butter Knife,专门为Android View设计的绑定注解,专业解决各种findViewById. 简介 对一个成员变量使用@BindView注解,并传入一个View ID, Butter ...
- 利用procedure批量插入数据
正文 要求在页面查询到5000条数据,为了方便插入,准备用shell脚本写curl命令调用自己写的代码接口,但是速度慢,而且写的时候遇到点儿小问题,故用sql语句写了这个功能 由于operat ...
- 【源码解析】自动配置的这些细节不知道,别说你会 springboot
spring-boot 相对于 spring,很重要的一个特点就是自动配置,使约定大于配置思想成功落地.xxx-spring-boot-starter 一系列引导器能够开箱即用,或者只需要很少的配置( ...