美文网首页
创建和销毁对象

创建和销毁对象

作者: 求闲居士 | 来源:发表于2016-10-10 16:34 被阅读17次
    1,考虑用静态工厂方法代替构造器

    切忌第一反应就是提供共有构造器,而不先考虑静态工厂。

    类可以通过静态工厂方法返回客户端而不是构造器。

    静态方法获取创建对象。

    注意静态工厂方法与设计模式中的工厂方法不同,并不直接对应。

    优势:
    • 它们有名称。

    可以通过方法名称描述返回的对象,使代码更易于阅读。对于通过参数创建不同对象时,静态工厂方法可以根据名称突出它们的区别。

    • 不必每次在调用它们时都创建一个新的对象。

    单例模式。

    • 它们可以返回原返回类型的任何子类型的对象。(接口)

    隐式地实现对象的创建。例如Collections,通过接口指定返回对象,用户不需知道怎么创建对象,通过静态工厂方法在Collections中导出。

    还可以每次调用时改变返回对象,这取决于静态工厂方法的参数值。例如EnumSet,它返回的实现类。

    静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在。这种灵活的静态工厂方法构成了服务提供者框架的基础。服务提供者框架有三个重要的组件:服务接口,提供者注册API,服务房屋API。感觉和android的WMS服务一样。

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

    想map创建时,Map<String, String> s = new HashMap<String, String>(),这样需要2次参数泛型。可以用于静态工厂方法将后面的创建简化。

    缺点
    • 类如果不含共有的或受保护的构造器,就不能被子类化。
    • 他们与其他的静态方法实际上没有区别。用户想要知道如何实例化这个类有些困难,所以要规范命名。如:ValueOf,getInstance,newInstance,getType,newType等。
    2,遇到多个构造器参数时要考虑用构造器builder

    如果具有多个参数时,Builder就是种不错的选择,特别当大多数参数都是可选的时候。它更易于编写和阅读。

    缺点
    • 为了创建它的对象,必须先创建构造器,在某些十分注重性能的情况下,可能造成某些问题。Builder模式比重叠构造器模式更加冗长。
    3,用私有构造器或者枚举类型强化Singlton属性

    使用私有构造器和枚举实现单例模式

    4,通过私有构造器强化不可实例化的能力

    它保证类在任何情况下都不会被实例化,显示的构造器被私有化了。

    场景:

    有时候,你可能需要编写只包含静态方法和静态域的类。

    5,避免创建不必要的对象
    • 如果是不可变对象,它就始终可以被重用。
    • 可以重用那些已知不会被修改的可变对象。
    • 有些情况则不怎么明显,如Map接口的keyset方法返回该Map对象的set视图,其中包含该Map中所有的键,每次调用返回的是同样的实例。
    • 自动装箱会创建多余的新对象。如Long和long。要优先使用基本类型而不是装箱基本类型,要担心无意识的装箱。
    • 并不是创建对象的代价非常昂贵,从而要尽量避免创建对象。相反,由于小对象的构造器只做很少的显示工作,所以小对象的创建和回收十分的廉价。通过维护自己的对象池来避免创建对象并不是一种好的做法,除非池中的对象非常重量级,想数据库连接池。
    6,消除过期对象的使用
    • 一般而言,只要类时自己管理内存,程序员就应该警惕内存泄露的问题。一旦元素被释放掉,则该元素中包含的任何对象引用都该被清空。 = null;
    • 内存泄露的另一个常见来源是缓存。可以使用线程进行清理,也可以在每次添加时顺便进行清理。
    • 监听器和其他回调。
      注册了回调,却没显式地取消注销。
    7,避免使用终结方法
    • 不应该依赖终结方法来更新重要的持久状态。例如:依赖终结方法来释放共享资源(比如数据库)上的永久锁,很容易让整个分布式系统垮掉。
    • 使用终结方法有一个非常严重的性能损失。

    提供一个显式的终止方法,要求改类的客户端在每个实例不再有用时调用这个方法。显式的终止一般与try-finally结构结合使用,以确保及时终止。

    相关文章

      网友评论

          本文标题:创建和销毁对象

          本文链接:https://www.haomeiwen.com/subject/ykhvyttx.html