对象的创建与销毁

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. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  2. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  3. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  4. [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  5. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

  6. Effective Java读书笔记--类和接口

    1.使类和成员的可访问性最小化不指定访问级别,就是包私有.protected = 包私有 + 子类一般private不会被访问到,如果实现了Serializable,可能会泄露.反射.final集合或 ...

  7. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...

  8. Effective Java 读书笔记(五):Lambda和Stream

    1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...

  9. Effective Java 读书笔记(一):创建和销毁对象

    1 构造器 => 静态工厂方法 (1)优势 静态工厂方法有名字 静态工厂方法不必在每次被调用时都产生一个新的对象 静态工厂方法能返回原返回类型的任意子类型的对象 静态工厂方法根据调用时传入的不同 ...

随机推荐

  1. [Abp vNext 源码分析] - 9. 接口参数的验证

    一.简要说明 ABP vNext 当中的审计模块早在 依赖注入与拦截器一文中有所提及,但没有详细的对其进行分析. 审计模块是 ABP vNext 框架的一个基本组件,它能够提供一些实用日志记录.不过这 ...

  2. Tomcat源码分析一:编译Tomcat源码

    Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...

  3. EF Core设置字段默认时间

    ---恢复内容开始--- 在EF的官方文档上只提到了用 Fluent API来设置默认值. 但是我们日常开发中,会把公用字段都写成基类.比如行创建时间 在需要默认时间的字段加上一个特性 [Databa ...

  4. idea中的java web项目(添加jar包介绍)和java maven web项目目录结构

    java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...

  5. markdown公式转为知乎格式

        在知乎中写技术类文章,经常会用到markdown知乎文章可以导入markdown格式,但是不支持Latex公式.知乎大神提供了替代方案: https://zhuanlan.zhihu.com/ ...

  6. 【源码解析】凭什么?spring boot 一个 jar 就能开发 web 项目

    问题 为什么开发web项目,spring-boot-starter-web 一个jar就搞定了?这个jar做了什么? 通过 spring-boot 工程可以看到所有开箱即用的的引导模块 spring- ...

  7. Redis系列(一):Redis简介

    一.Redis概述 Redis是一个开源(遵循BSD协议)Key-Value数据结构的内存存储系统,用作数据库.缓存和消息代理.它支持5种数据结构:字符串string.哈希hash.列表list.集合 ...

  8. shark恒破解笔记3-EAX决定胜负

    PEID查壳 od载入 输入假的注册码 查找出错字符串 往上查找是否有关键跳转和关键call 可以看到此处有个je跳转 实现了跳转,并且跳过了我们注册成功的地址 网上查找这个跳转的关键call,这个c ...

  9. HTML 元素居中的方法

    网址:http://www.cnblogs.com/asqq/archive/2012/04/09/2438745.html 1. 元素的定位的方法选择 :absolute . 2. 给定元素的宽和高 ...

  10. tkinter基础-标签、按钮

    本节内容: 明白标签.按钮的使用 实现简单的点击界面 Tkinter 简称tk,在python中属于内置模块,不需要进行安装,可直接引用,import tkinter 一. 首先我们做一个如图所示的图 ...