对象的创建与销毁

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》 读书笔记(一)的更多相关文章

  1. 《html5 从入门到精通》读书笔记(一)

    今天看了<html5 从入门到精通>这本书,感觉阅读下来很舒心,不像阅读其他书籍很揪心.html增加的知识点,我觉得非常有价值,看完几章记录了一些内容,不但能巩固,也为下次遗忘知识点做好准 ...

  2. HTML5从入门到精通(明日科技) 中文pdf扫描版

    HTML5从入门到精通(明日科技) 中文pdf扫描版

  3. HTML5从入门到精通(千锋教育)免费电子版+PDF下载

    本书是HTML5初学者极好的入门教材之一,内容通俗易懂.由浅入深.循序渐进.本书内容覆盖全面.讲解详细,其中包括标签语义化.标签使用规范.选择器类型.盒模型.标签分类.样式重置.CSS优化.Photo ...

  4. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  5. Oracle从入门到精通----学习笔记

    书名:<Oracle从入门到精通:视频实战版>秦靖.刘存勇等编著 第4章 SQL基础 1.SQL语言分类 数据定义语言 --- DDL,Data Definition Language 数 ...

  6. MySQL数据库应用 从入门到精通 学习笔记

    以下内容是学习<MySQL数据库应用 从入门到精通>过程中总结的一些内容提要,供以后自己复现使用. 一:数据库查看所有数据库: SHOW DATABASES创建数据库: CREATE DA ...

  7. Unity Shader入门精要读书笔记(二)UnityShader概述

    第三章<UnityShader概述>的读书笔记: 1.Unity Shader模板提供了几种选择: 标准光照模型(新添加的基于物理的渲染方法) 不含光照的基本的顶点.片元着色器 屏幕后处理 ...

  8. 《html5 从入门到精通》读书笔记(二)

    接着上面继续记录笔记,这次要记的知识点比较多...记录下我认为比较重要的东西. 一.表单属性 1.autocomplete属性 该属性规定form或input域应该拥有自动完成功能. <form ...

  9. 《html5 从入门到精通》读书笔记(三)

    二.标签详解 标签 描述 4 5 <form> 定义表单. 4 5 <h1> to <h6> 定义标题1到标题6. 4 5 <head> 定义关于文档的 ...

  10. 《HTML5 CANVAS基础教程》读书笔记

    一.HTML5简介 1.HTML5新特性 1)结构元素:section,header,hgroup,footer,nav,article,aside, 2)内容元素:figure,figcaption ...

随机推荐

  1. split 过滤空的元素

    命令形式: split(str='',number=string.count(str))[n] str 分隔符 number 切分几次,[n] 获取第几个值. 1.如果切分的可迭代对象中包含空元素的解 ...

  2. istio入门(01)istio的优势在哪里?

    Istio能做什么?Istio 试图解决微服务实施后面临的问题.Istio 提供了一个完整的解决方案,对整个服务网格行为洞察和操作控制,以满足微服务应用程序的多样化需求. Istio在服务网络中提供了 ...

  3. 为什么Java不能以返回值区分重载方法?

    读者可能会想:"在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?" 比如下面两个方法,虽然他们有相同的名字和形式参数,但却很容易区 ...

  4. Python scrapy框架

    Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...

  5. highchart

    highchart 1 2 #下载 https://www.highcharts.com/download a. 简单例子 <!DOCTYPE html> <html lang=&q ...

  6. python--socket/Socketerver并发/udp

    Socketerve并发 基于tcp套接字,关键就是两个循环,一个链接循环,一个通讯循环 Socketserver模块中分两个大类:server类(解决链接问题)和request类(解决通信问题) s ...

  7. 卷积神经网络(CNN)中卷积的实现

    卷积运算本质上就是在滤波器和输入数据的局部区域间做点积,最直观明了的方法就是用滑窗的方式,c++简单实现如下: 输入:imput[IC][IH][IW] IC = input.channels IH ...

  8. Angular筛选功能

    业务场景:依据级别(level )和主题(Subtype )向后台传参数,进行筛选向前台返回数据列表. 代码如下:其中filterChoose()用于弹出筛选下拉框,filterButton()用于选 ...

  9. 理解error和exception之间的区别

    很多程序员不清楚error和exception之间的区别,这区别对于如何正确的处理问题而言非常重要(见附1,"简要的叙述error和exception").就像Mary Campi ...

  10. python3全栈开发- 元类metaclass(面试必考题)

    一.知识储备 #exec:三个参数 #参数一:字符串形式的命令 #参数二:全局作用域(字典形式),如果不指定,默认为globals() #参数三:局部作用域(字典形式),如果不指定,默认为locals ...