深圳建网站价格,防水堵漏公司做网站效果怎样,什么值得买网站模版,wordpress页面管理插件众所周知#xff0c;要想能获取一个类的实例#xff0c;该类得要提供一个public的构造器。但是《Effective Java》书中说还有一个方法#xff0c;那就是提供静态工厂方法#xff08;static factory method#xff09;#xff0c;该方法时静态#xff0c;同时可以根据参数… 众所周知要想能获取一个类的实例该类得要提供一个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模式就是例子。 不像构造器那样静态工厂方法可以返回类型的某个子类型 静态工厂方法可以减少冗长的创建参数化类型时的代码 当使用构造器创建参数类型时我们要这样做 MapString, ListString m new HashMapString, ListString(); 如果HashMap里有个方法时这样的 public static K, V HashMapK, V newInstance() {return new HashMapK, V();} 那么我们便可以这样创建实例 MapString, ListString m HashMap.newInstance(); 不过现在还不能支持这样的类型推导不过总有一天会支持的吧。 缺点 一个类在仅提供静态工厂方法同时没有公共或受保护的构造器时此类是没法被子类化的 在Collections Framework里就有这样的例子。不过这也算是因祸得福吧这样我们可以尽量去通过组合composition而不是去通过继承inheritance来解决某些问题。 静态工厂方法和其他的静态方法没什么差别 总结 转载于:https://www.cnblogs.com/Devfly/archive/2009/11/10/Consider-static-factory-methods-instead-of-constructors.html