众所周知,要想能获取一个类的实例,该类得要提供一个public的构造器。但是《Effective Java》书中说还有一个方法,那就是提供静态工厂方法(static factory method),该方法时静态,同时可以根据参数返回一个类的实例。这里的静态工厂方法(static factory method)和设计模式里的工厂方法(factory method)是不一样的,我觉得工厂方法注重的是多态。

使用静态工厂方法有利也有弊。

优点:

不像构造器那样,静态工厂方法拥有名字

静态工厂方法是有名称的,这样就有了“可读性”,看到方法的名称就能知道能返回什么样的实例。而对于构造器,通过提供参数,但是有时会让人很迷惑,因为有时是因为传递的参数之不同而返回特定的实例,书中举的例子是BigInteger(int, int, Random)这个构造器,如果想要返回一个素数,那么你就得传入合适的参数进去,但是如果BigInteget中有个静态方法是probablePrime,那么当开发者一看名字就很明白了,明白这个方法返回的是什么实例。有时一个类会有几个构造器,每个构造器的参数个数相差一点点,或者是参数个数相等,但是各个参数的意义不同,有时是参数个数不等,这些情况下,当使用该类的开发人员在用构造器实例化时,会很苦恼,得去看文档,知道每个参数的意义才行。

我觉得这一点是很实用的,在平时写代码时,我觉得得用上。

不像构造器那样,每次调用都要创建对象

Boolean.valueOf(boolean)这个方法正体现了这一点,通过阅读源代码,可以发现在Boolean类里有TRUE和FALSE这两个静态字段。valueOf方法只是判断传来的参数值然后返回合适的对象(TRUE或FALSE),也就是说这两个对象只是在Boolean类加载时创建,以后如果需要用到,就不要再重新创建,直接返回就行了。如果创建某个对象的代价相当可观,那么这个方法的优点就很明显了。不过的确是有不少情况,我们不需要重复地创建对象。

通过静态工厂方法,我们还可以在每次调用时都返回同一个对象。singleton模式就是例子。

不像构造器那样,静态工厂方法可以返回类型的某个子类型

静态工厂方法可以减少冗长的创建参数化类型时的代码

当使用构造器创建参数类型时,我们要这样做:

Map<String, List<String>> m = new HashMap<String, List<String>>();

如果HashMap里有个方法时这样的:

public static <K, V> HashMap<K, V> newInstance() {return new HashMap<K, V>();}

那么我们便可以这样创建实例:

Map<String, List<String>> m = HashMap.newInstance();

不过现在还不能支持这样的类型推导,不过总有一天会支持的吧。

缺点

一个类在仅提供静态工厂方法,同时没有公共或受保护的构造器时,此类是没法被子类化的

在Collections Framework里就有这样的例子。不过这也算是因祸得福吧,这样我们可以尽量去通过组合(composition),而不是去通过继承(inheritance)来解决某些问题。

静态工厂方法和其他的静态方法没什么差别

总结

转载于:https://www.cnblogs.com/Devfly/archive/2009/11/10/Consider-static-factory-methods-instead-of-constructors.html

《Effective Java》读书笔记 Item 1:考虑静态工厂方法,而不是构造器相关推荐

  1. 使用静态工厂方法而不是构造器

    注意:静态工厂方法不是设计模式中的工厂方法. 一个类向客户端提供静态工厂方法有如下好处: 有名称,不用根据参数类型和顺序区分重载方法,让代码更易读 是否每次调用都需要新对象是可控制的,对于不可修改的对 ...

  2. 一起读经典-《Effective Java》1.1 考虑使用静态工厂方法代替构造器

    1.静态工厂方法相较于构造器的优点 a.静态工厂方法能够自定义名称,使代码可读性更高 b.不必在每次调用的时候都创建新的实例 c.可以返回类型的子类型对象 2.静态工厂方法的常用名称: value o ...

  3. Effective Java 第一条:考虑用静态工厂方法代替构造器

    优势: 第一条:静态工厂方法有名称,可以从名字看出方法的作用,容易使用. 第二条:不必每次调用都创建一个新对象. 第三条:静态工厂方法可以返回原类型的任何子类型的对象. 第四条:在创建参数化类型的实例 ...

  4. Effective Java读书笔记三:创建和销毁对象

    第1条:考虑用静态工厂方法代替构造器 对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器.还有一种方法,类可以提供一个公有的静态工厂方法(static factory ...

  5. Effective Java读书笔记(二)

    Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...

  6. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  7. Effective Java读书笔记

    序列化 谨慎的实现Serializable接口 实现Serializable最大的代价,一旦这个类被发布就大大降低了改变这个类实现的灵活性,这个类中所有私有实例域都将变成导出API的一部分,不符合最低 ...

  8. Effective Java 读书笔记(一)

    前言: 开个新的坑位,<effective java>的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了.今天这篇主要 ...

  9. Effective Java读书笔记八:序列化(74-78)

    第74条:谨慎地实现Serializable接口 对象序列化API,它提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象.将一个对象编码成一个字节流,称作将该对象序列化,相反的处理过 ...

  10. Effective Java读书笔记一(Java Tips.Day.1)

    Tip1. 考虑用静态工厂方法替代构造器 优势 静态工厂方法有名称,能够确切的描述正被返回的对象. 当一个类需要多个相同签名的构造器时,用静态工厂方法替代它们. 静态工厂方法不必在每次调用它们的时候都 ...

最新文章

  1. wp配置后台自动更新
  2. log4j用法http://zengjinliang.javaeye.com/blog/171550
  3. IOS开发之UIView
  4. 湖南大学计算机考研考什么,2017年湖南大学计算机系统考研大纲
  5. 解决引入 lombok 注解不生效
  6. 15分钟了解Apache Phoenix(HBase的开源SQL引擎)
  7. 【JAVA基础篇】面对对象的特征
  8. linux-facl权限入门-设置与查看facl权限
  9. 给内部类对象数组属性赋值时报错:Exception in thread main java.lang.NullPointerException...
  10. jqgrid 编辑列拿不到值_如何在DAX Stadio和Excel中返回表和度量值?
  11. centos apache 腾讯云ssl证书配置
  12. 单片机启动流程(以STM32为例)
  13. JAVA SSH框架的配置(myeclipse(9)+tomcat(6.0.35)+struts(2.2.3)+Spring(3.0)+Hibernate(3.0))
  14. 三星PM981(a)硬盘安装黑苹果(第五版)
  15. 集成融云 即时通讯总结
  16. org.apache.jasper.JasperException: /app/jsonp.jsp(1,2) Page-encoding specified in jsp-property-grou
  17. vue-router使用
  18. 台湾大学开放式课程C语言,国立台湾大学-台大开放式课程.doc
  19. week11作业——C - 必做题11-3
  20. C++基础:模板:函数模板和类模板

热门文章

  1. 7个相同小球4个不同盒子_【计算启蒙】4个游戏陪娃玩懂“数拆分”,加减法都不用愁!...
  2. Linux基础第五课——用户管理
  3. 最常出现的字符串 Most Common Word
  4. JAVA分代收集机制详解
  5. ide在控制台输入编译命令_快速编译调试 Redis
  6. 机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及
  7. ubuntu 查看日历,日期
  8. C/C++中的常量指针与指针常量
  9. 计算机电路基础张志良,计算机电路基础
  10. 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解