对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器。

另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地。类能够提供一个共同拥有的静态 工厂方法。它仅仅是返回类的实例的静态方法。

类能够通过静态工厂方法类提供它的client(对象),而不是通过构造器。提这样做的优点有:

1.静态工厂方法与构造器不同的第一大优势在于。它们有名称.比方构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,假设用名为BigInteger.probablePrime的静态工厂方法来表示,显然更为清楚。当一个类须要多个带有同样签名的构造器时,就用静态工厂方法取代构造器,而且谨慎地选择名称以便突出它们之间的差别。

2.静态工厂方法与构造器不同的第二大优势在于,不必再每次调用它们的时候都创建一个新对象。这个详细不说了,能够看下单例模式。

3.静态工厂方法与构造器不同的第三大优势在于。它们能够返回原返回类型的不论什么子类型的对象。这项技术适用于基于接口的框架。使用这样的静态方法时。甚至要求额client通过接口来引用被返回的对象。而不是通过它的实现类来引用被返回的对象,这是一种良好的习惯。

4.静态工厂方法的第四大优势在于。在创建參数化类型的实例的时候,它们使代码变得更加简洁。

缺点:

静态工厂方法的主要缺点在于,类假设不含有共同拥有的或者受保护的构造器,就不能被子类化。

静态工厂方法的第二个缺点在于,它们与其它的静态方法实际上没有不论什么差别。

在API文档中,它们没有像构造器那样明白标识出来。因此,对于提供了静态工厂方法而不是构造器的类来说。要想查明怎样实例化一个类,这是很困难的。只是你通过在类或者接口凝视中关注静态工厂,并遵守标准的命名习惯,也能够弥补这一劣势。以下是一些惯用名称:

valueOf

of

getInstance

newInstance

getType

newType

简而言之。静态工厂方法和共同拥有构造器都各实用处,我们须要理解它们各自的唱出。

静态工厂通常更加合适,因此切忌第一反应就是提供公有的构造器,而不先考虑静态工厂。

Effective java读书札记第一条之 考虑用静态工厂方法取代构造器的更多相关文章

  1. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

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

  2. Effective Java第三版(一) ——用静态工厂代替构造器

    此文做为<Effective Java>系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!<E ...

  3. effective java 3th item1:考虑静态工厂方法代替构造器

    传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多 ...

  4. Java - 用静态工厂方法代替构造器

    Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...

  5. 高效JAVA之用静态工厂方法代替构造器

    程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪 ...

  6. 改善JAVA代码01:考虑静态工厂方法代替构造器

    前言 系列文章:[传送门]   每次开始新的一本书,我都会很开心.新书新心情. 正文 静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器 ...

  7. Effective Java —— 用静态工厂方法代替构造器

    本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...

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

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

  9. 【读书笔记 - Effective Java】01. 考虑用静态工厂方法代替构造器

    获取类的实例有两种方法: 1. 提供一个公有的构造器(最常用). 2. 提供一个公有的静态工厂方法(static factory method). // 静态工厂方法示例 public static ...

随机推荐

  1. Block修改变量容易被忽略的方法

    C语言里面的 静态变量 静态全局变量 全局变量 其中静态变量和普通变量的截取模式是一样的,只是因为他赋值不被丢弃,所以能修改成功 code: #import <Foundation/Founda ...

  2. 20162327WJH Android开发程序设计实验报告

    学号 20162327 <程序设计与数据结结构>Android开发程序设计实验报告 实验一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第 ...

  3. 【8.23校内测试】【贪心】【线段树优化DP】

    $m$的数据范围看起来非常有问题??仔细多列几个例子可以发现,在$m<=5$的时候,只要找到有两行状态按位$&$起来等于$0$,就是可行方案,如果没有就不行. #include<i ...

  4. 【8.17校内测试】【模拟】【set】【网络流】

    为什么每次想的最久的题得的分数最低!!!qwqwq 再也不在noip上尝试A*叻!! 模拟题,先把能消的消掉,双指针从两端向中间扫描,如果头尾合并可以消,就把它消掉,最后判断一下.因为消完过后num保 ...

  5. [转]android系统各种音量的获取与设置

    获取系统音量 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法:publicvoidsetStreamV ...

  6. April Fools Day Contest 2016 D. Rosetta Problem

    D. Rosetta Problem 题目连接: http://www.codeforces.com/contest/656/problem/D Description ++++++++[>+& ...

  7. Shell基础学习(六) 流程控制

    1.if if的语法格式 if conditon then command1 command2 ``` commandn fi 2.if else if conditon then command1 ...

  8. 【原】配置Log4j,使得MyBatis打印出SQL语句

    [环境参数] JDK:jdk1.8.0_25 IDE:Eclipse Luna Servie Release 1 框架:Spring 4.1.5 + SpringMVC 4.1.5 + MyBatis ...

  9. HP-unix如何生成动态库?

    HP-unix系统生成动态库编译的方法? 创建PIC中间文件的编译器选项是+z,创建动态库的链接器标志是-b. 1. cc +z d1.c d2.c /* 编译以".o"为扩展名的 ...

  10. TSearch & TFileSearch Version 2.2 -Boyer-Moore-Horspool search algorithm

    unit Searches; (*-----------------------------------------------------------------------------* | Co ...