专栏首页程序员开发者社区Effective Java--第1条静态工厂方法代替构造方法

Effective Java--第1条静态工厂方法代替构造方法

为什么要用静态工厂方法代替构造方法???

  1. 静态方法有名称。构造器名和类名一致,静态方法名可以自己定义,例如,BigInteger.probalePrime,可读性强.
  2. 静态方法, 不必每次调用他的时候都新建一个对象。这也是为啥推荐使用Boolean.valueOf(),不推荐new
  3. 静态方法有返回值,可以返回原返回类型任何子类对象,有更大的灵活性。
  4. 使代码变得更加简洁

import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class Services { private Services(){ } // Map Service Name to Services public static final Map<String,Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; // Provider Register API public static void registerDefaultProvider(Provider p){ registerProvider(DEFAULT_PROVIDER_NAME,p); } public static void registerProvider(String defaultProviderName, Provider p) { providers.put(defaultProviderName, p); } public static Service newInstance(){ return newInstance(DEFAULT_PROVIDER_NAME); } public static Service newInstance(String name){ Provider p = providers.get(name); if(p == null){ throw new IllegalArgumentException("No provider registered with name: " + name); } return p.newService(); } }

静态工厂方法代替构造器去创建对象, 在可读性,不重复new对象,和灵活性,代码更简洁4方面有优势。

测试类:

public class Test { /** * 静态工厂方法主要缺点,类如果不含公有的或者受保护的构造器,就不能子类话。 * 静态工厂的第二个缺点在于,他们与其他静态方法实际上没有其他区别。 * * @param args */ public static void main(String[] args) { // Providers would execute these lines Services.registerDefaultProvider(DEFAULT_PROVIDER); Services.registerProvider("comp", COMP_PROVIDER); Services.registerProvider("armed", ARMED_PROVIDER); // Clients would execute these lines Service s1 = Services.newInstance(); Service s2 = Services.newInstance("comp"); Service s3 = Services.newInstance("armed"); System.out.printf("%s, %s, %s%n", s1, s2, s3); } private static Provider DEFAULT_PROVIDER = new Provider() { public Service newService() { return new Service() { @Override public String toString() { return "Default service"; } }; } }; private static Provider COMP_PROVIDER = new Provider() { public Service newService() { return new Service() { @Override public String toString() { return "Complementary service"; } }; } }; private static Provider ARMED_PROVIDER = new Provider() { public Service newService() { return new Service() { @Override public String toString() { return "Armed service"; } }; } }; }

本文分享自微信公众号 - 程序员开发者社区(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongoDB 索引

    当往一个集合中插入多个文档后,每个文档经过存储殷引擎后,有一个位置信息,通过这个位置信息。就能从存储引擎中读出该文档。在 mmapv1 引擎下,位置信息是【文件...

    王小明_HIT
  • Java 序列化基础知识

    序列化机制允许将实现序列化接口的Java对象转换为字节序列。这些字节序列化可以保存到磁盘上,通过网络传输,以达到恢复到原来的对象的目的。

    王小明_HIT
  • Java常用问题排查工具

    jstack能得到运行java程序的java stack和native stack的信息

    王小明_HIT
  • java基础第十五篇之IO流和递归算法

    缓冲区会在内存中创建一个8192容量的字节数组,内存的运算效率比硬盘要高的多所有只要降低到硬盘的读写次数就会提高效率.

    海仔
  • 通过Java代码自动发布Geoserver的地图服务WMS

    GeoServer 顾名思义。是一个Server,它是开源的,允许用户查看和编辑地理数据的服务器,它可以比较容易的在用户之间迅速共享空间地理信息。利用Geose...

    我叫刘半仙
  • Java-内部类

    如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象(在静态方法内部创建某个内部类的对象),那么必须像在main()方法中那样,具体地指明这个对象的类型...

    桑鱼
  • Java知识点总结之Java泛型

    用户1257393
  • 使用Provider来进行状态管理

    当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/WIdget)的多个子组件之间共享状态(数据),这个时候我们就需要用Flutt...

    拉维
  • java学习day15---UDP,reflect,proxy

    1.UDP udp是一种不安全的协议 容易丢失数据 不需要建立连接 效率高 数据是以数据包的形式发送 数据 IP 端口

    曼路
  • SpringBoot几个注解MockMvcWireMockSwagger2@JsonViewHibernate Validator异常处理拦截方式上传下载异步处理RESTSpring Security

    只有特定名称或者类型的Bean(通过@ConditionalOnMissingBean修饰)不存在于BeanFactory中时才创建某个Bean

    spilledyear

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动