第1条 考虑用静态工厂方法代替构造器

来源:互联网 发布:淘宝淘客 编辑:程序博客网 时间:2024/06/06 17:47

     构造器是创建一个对象实例的最基本,最通用的方法。在使用某个class的时候,一般考虑的是如何创建和初始化对象的实例。我们一般考虑的方式就是通过构造函数来完成。其实还有一种方法,也应该在每个程序员的工具箱中占一席之地。类提供了一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。

     下面一个是Boolean的例子,就是将boolean基本数据类型转换为Boolean对象的引用。

public class First {public static Boolean valueof(boolean b) {return b ? Boolean.TRUE : Boolean.FALSE;}public static void main(String[] args) {boolean b = true;System.out.println(valueof(b));}}
      提供静态工厂方法而不是构造器,有下面几点优势:

     1.名字更有意义

     一个类只能有一个带有指定签名的构造器。一般我们要提供两个构造器,它们的参数类型的顺序上有所不同。在面对API时,我们都会忘记调用哪个构造器合适,这并不是好主意。当一个类有多个构造器的时候,就用静态工厂方法代替构造器,并选择合适的方法名来识别。

    例如:构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probablePrime的静态工厂方法来表示,显得更清楚。

     2.不必每次调用它们的时候都创建一个新对象

     对于构造方法,每次都要创建对象,而对于静态工厂方法时,由于是静态的,在调用的时候实例应该都存在,不必每次都创建。

     3,可以返回原返回类型的子类型的对象

     在java collection framework的集合接口中,提供了大量的静态工厂方法返回集合接口的实现类型,例如Collections.subList()等。发行版1.5中引入的类java.util.EnumSet没有公有构造器,只有静态工厂方法。它们返回两类实现类之一,具体则取决于底层枚举类型的大小:如果它的元素有64个或者更少,就像大多数枚举类型一样,静态工厂方法就会返回一个RegalarEnumSet实例,用单个long进行支持;如果枚举类型有65个或者更多元素,工厂就返回JumboEnumSet实例,用long数组进行支持。

      4.在创建参数化类型实例的时候,它们使代码变得更加简洁。

   Map<String,List<String>> map=new HashMap<String,List<String>>();
      由于java构造器无法进行类型的推演,因此也不能通过构造器的参数类型来实例化指定类型参数的实例化对象。然而静态工厂方法则可以利用参数类型推演的优势,避免了类型参数在一次声明中被多次重新的烦恼。如下:

    

 public static <K,V> HashMap<K, V> newInstance(){          return new HashMap<K, V>();          }
   静态工厂方法鼓励程序使用复合而不使用继承。


因此也就无法通过构造器的参数类型来实例化

指定类型参数的实例化对象。然而通过静态工厂方法则可以利用参数类型推演的优势,避免了类型参数在

因此也就无法通过构造器的参数类型来实例化

指定类型参数的实例化对象。然而通过静态工厂方法则可以利用参数类型推演的优势,避免了类型参数在

因此也就无法通过构造器的参数类型来实例化

指定类型参数的实例化对象。然而通过静态工厂方法则可以利用参数类型推演的优势,避免了类型参数在

因此也就无法通过构造器的参数类型来实例化

指定类型参数的实例化对象。然而通过静态工厂方法则可以利用参数类型推演的优势,避免了类型参数在

0 0
原创粉丝点击