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

  此文做为《Effective Java》系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!《Effective Java》第三版较之上一版新增了对Java7、8、9的一些新特性的条目。而条目的概念可以理解为武功秘籍中的一招一式,学完了每一招一式,就是神功大成之时。第三版在第二版的基础上新增了一些条目数,达到了90条。书就介绍到这里,下面介绍第一条——用静态工厂代替构造器。

  对于创建对象,最熟悉的莫过于使用new关键字调用对象提供的构造器来创建对象,而此书的第一条告诉我们,类可以提供一个公有的静态工厂方法来创建对象。(ps:这里的静态工厂方法并不直接对应设计模式中的工厂模式,请大家不要对号入座),首先我们来看一看静态工厂方法的优点,也就是为什么我们要使用它。

五大优点:

一.它有名称。这样说是因为,构造器必须与类同名,一个类无论有多少构造器,它们的名字都是一样的,即和类同名。但是静态工厂方法不同,它可以有具体意义的名称,例如一个User类可以有一个adminUser()方法来提供一个管理员用户。

二.不必在每次调用它们的时候都创建一个新对象。如以下代码,可以有效的避免创建不必要的重复对象。

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}

三.可以返回原返回类型的任何子类型,主要适用于基于接口的框架。

四.所返回的对象可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。

五.方法返回的对象所属类,在编写包含该静态工厂方法的类时可以不存在。

两个缺点:

一.类如果不包含公有的或者受保护的构造器,就不能被子类化。

二.程序员很难发现它。

总结:静态工厂方法与构造器各有优缺点,我们需要理解各自的长处,以便更加合适的使用。相对来讲静态工厂方法能够提供更加强大的功能,当我们做为服务方时静态工厂方法无疑能使我们提供的服务更加灵活多变和强大。而对于它的两个缺点,尤其是第二缺点完全可以通过命名的规范化及良好的注释来规避这一缺点。

附:

静态方法常用命名:

  • from 类型转换方法,如:Date date = Date.from(Instant.now());
  • of 聚合方法,

  如Set<ResolverStyle> styles = EnumSet.of(ResolverStyle.LENIENT,ResolverStyle.SMART,ResolverStyle.STRICT);
  • valueOf 比from和of更繁琐的一种替代方法,如:BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
  • instance或者getInstance 常用作单例模式的实现;
  • create或者newInstance 每次调用返回新的实例;

原文地址:https://www.cnblogs.com/a-dust/p/11143610.html

时间: 2024-10-13 03:14:21

Effective Java第三版(一) ——用静态工厂代替构造器的相关文章

《Effective Java 第三版》新条目介绍

前言 从去年的3月份起我就在开始读<Effective Java 第二版>,当然,我读的是中文版的:可能是我理解能力还不行,对于书中的内容总是感觉理解困难:就拿第一章的内容「创建和销毁对象」来说吧,这是我读的次数最多的一章,想必原因大家也是明白的,每次我读不下去的时候,我就从头开始读,所以,现在我对这本书的第一章是最为熟悉的了.后来,有一次我上网看到有网友说这本书确实和绝大部分的翻译书籍一样,对于有些原文中的内容翻译的不是很流畅,所以会导致阅读的人感觉难以理解:于是,我就斗胆下了本英文的原版来

Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 3. 使用私有构造方法或枚类实现Singleton属性 单例是一个仅实例化一次的类[Gamma95].单例对象通常表示无状态对象,如函数(条目 24)或一个本质上唯一的系统

Effective Java 第三版——10. 重写equals方法时遵守通用约定

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 10. 重写equals方法时遵守通用约定 虽然Object是一个具体的类,但它主要是为继承而设计的.它的所有非 final方法(equals.hashCode.toStr

Effective Java 第三版——12. 始终重写 toString 方法

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 12. 始终重写 toString 方法 虽然Object类提供了toString方法的实现,但它返回的字符串通常不是你的类的用户想要看到的. 它由类名后跟一个"

Effective Java 第三版——14.考虑实现Comparable接口

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. ?14.考虑实现Comparable接口 与本章讨论的其他方法不同,compareTo方法并没有在Object类中声明. 相反,它是Comparable接口中的唯一方法.

Effective Java 第三版——18. 组合优于继承

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 18. 组合优于继承 继承是实现代码重用的有效方式,但并不总是最好的工具.使用不当,会导致脆弱的软件. 在包中使用继承是安全的,其中子类和父类的实现都在同一个程序员的控制之

Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 19. 如果使用继承则设计,并文档说明,否则不该使用 条目 18中提醒你注意继承没有设计和文档说明的"外来"类的子类化的危险. 那么为了继承而设计和文档

Effective Java 第三版——20. 接口优于抽象类

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 20. 接口优于抽象类 Java有两种机制来定义允许多个实现的类型:接口和抽象类. 由于在Java 8 [JLS 9.4.3]中引入了接口的默认方法(default met

Effective Java 第三版——21. 为后代设计接口

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 21. 为后代设计接口 在Java 8之前,不可能在不破坏现有实现的情况下为接口添加方法. 如果向接口添加了一个新方法,现有的实现通常会缺少该方法,从而导致编译时错误. 在