zoukankan      html  css  js  c++  java
  • 【代码优化】考虑使用静态工厂方法取代构造器

    静态工厂方法与设计模式中的工厂方法模式不同,和设计模式中的工厂方法模式不直接相应。


    使用静态工厂方法比构造器的优势


    第一、静态工厂方法是有名称的,而构造器是通过參数推断的。

    每一个静态工厂方法都有自己的名字,能够依据名称就能够推断它要做什么事情,而构造器是做不到的。

    如:构造器BigInteger(int,int),返回BigInteger能够是素数,偶数等。而用名称BigInteger。probalePrime的静态工厂方法

    就一目了然了,代码easy阅读。


    第二、不必再每次调用时候都创建一个新的对象。

    一个类预先构建一个实例。缓存起来。进行反复利用,避免不必要的反复对象。

    实例的受控是的不可变类确保是一个Singleton或者是一个不可实例化的,使得不可变类能够保证不会存在两个相等的实例,

    即a==b的时候才有a.equal(b)为TRUE。

    若果保证了这点就能够使用a==b取代a.equal(b),提升了性能。


    第三、能够返回原类型的不论什么子类型的对象,这个都非常easy理解,


    第四、创建參数化类型实例时,代码更简洁。

    在java8之前,遗憾的是,在调用參数化类型构造器时。即使类型參数非常明显,也必须指明。如:

    Map<String> map=new HashMap<String>(); 

    两次指明泛型类型,要是泛型变的更复杂。就多写了非常多代码。

    而使用静态工厂方法的实现就简洁非常多了:

    public static<K,V>  HashMap<K,V> newInstance() {

    return newHashMap<K,V>();

    }//这段代码能够复用

    Map<K,V> map=HashMap.newInstance();


    只是,什么事情都不是完美的,静态工厂方法也有它的缺点

    1、类假设不含有公有的或者受保护的构造器,就不能被子类化。

    也就是说。你不能把类的不论什么方便的实现类子类化,这是不可能的。


    2、它和静态方法实际上没有不论什么差别。

    因此,对于提供了静态工厂方法而不是构造器的类来说,要想查明怎样实例化一个类。是非常困难的。


    总之,静态工厂方法和公有构造器各有优势,我们仅仅需了解他们的特性。各取所需,通常情况下,不要第一反应就提供

    公有的构造器。最好还是考虑试试静态工厂。



  • 相关阅读:
    62. 不同路径-dp-中等
    49. 字母异位词分组-字符串-中等
    34. 在排序数组中查找元素的第一个和最后一个位置-二分查找-中等
    33. 搜索旋转排序数组-二分查找-中等
    221. 最大正方形-dp-中等难度
    38. 外观数列-字符串-中等难度
    mysql-索引/视图/存储过程/函数/触发器
    mysql-常用命令
    MDK5.34发布,AC6升级至V6.16(2021-03-19)
    STM32H7的CAN FD教程笔记
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7183514.html
Copyright © 2011-2022 走看看