• Effective Java 01 Consider static factory methods instead of constructors


     Advantage

    • Unlike constructors, they have names. (BigInteger.probablePrime vs BigInteger(int, int, Random)
    • They are not required to create a new object each time they're invoked(Flyweight pattern). This ensures that a.equals(b) if and only if a = = b. Then the client can use = = instead of equals method which gets better performance to Equals method.
    • It can return an object of any subtype of their return type.(This gives you great flexibility in choosing the class of the returned object. )

      /********************sample code ******************/

      // Service provider framework sketch

      // Service interface

      public interface Service {

      ... // Service-specific methods go here

      }

      // Service provider interface

      public interface Provider {

      Service newService();

      }

      // Noninstantiable class for service registration and access

      public class Services {

      private Services() {

      } // Prevents instantiation (Item 4)

      // Maps service names to services

      private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();

      public static final String DEFAULT_PROVIDER_NAME = "<def>";

      // Provider registration API

      public static void registerDefaultProvider(Provider p) {

      registerProvider(DEFAULT_PROVIDER_NAME, p);

      }

      public static void registerProvider(String name, Provider p) {

      providers.put(name, p);

      }

      // Service access API

      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();

      }

      }

    • Reduce the verbosity of creating parameterized type instances.
    Disadvantages
    • The class without public or protected constructors cannot be subclassed.
    • They are not readily distinguishable from other static methods.

    Here are some common names for static factory methods:

    • valueOf—Returns an instance that has, loosely speaking, the same value as its

    parameters. Such static factories are effectively type-conversion methods.

    • of—A concise alternative to valueOf, popularized by EnumSet(Item 32).

    • getInstance—Returns an instance that is described by the parameters but

    cannot be said to have the same value. In the case of a singleton, getInstance

    takes no parameters and returns the sole instance.

    • newInstance—LikegetInstance, except that newInstanceguarantees that

    each instance returned is distinct from all others.

    • getType—Like getInstance, but used when the factory method is in a different class. Type indicates the type of object returned by the factory method.

    • newType—Like newInstance, but used when the factory method is in a different class. Type indicates the type of object returned by the factory method.

    作者:小郝
    出处:http://www.cnblogs.com/haokaibo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Qt 配置fakevim
    CentOS安装Ruby组件
    Linux shell 操作 postgresql,并设置crontab任务
    修改win7锁定界面背景
    Ubuntu安装Redis
    Java 向SQL Server插入文件数据
    用VMware vSphere Client客户端登陆vsphere5提示错误
    DD应用实例
    shell初学
    deepin2014.1快捷键
  • 原文地址:https://www.cnblogs.com/haokaibo/p/consider-static-factory-methods-instead-of-constructors.html
Copyright © 2020-2023  润新知