美文网首页
1.6:避免创建不必要的对象

1.6:避免创建不必要的对象

作者: 洞妖洞妖01 | 来源:发表于2020-05-25 17:46 被阅读0次

    ① 不可变类,采用静态工厂方法

    对于不可变类,若同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂而不是构造器,以避免创建不必要的对象。例如:静态工厂方法Boolean.valueOf(String)几乎总是优先于构造器Boolean(String)。

    ②初始化后还会改变的对象,如何重用?

    考虑适配器(adapter)的情形,有时也叫做视图(view)。适配器是指这样一个对象:它把功能委托给一个后备对象(backing object),从而为后备对象提供一个可以代替的接口*。由于适配器除了后配对象之外,没有其他的状态信息,所以针对某个给定对象的特定适配器而言,它不需要创建多个适配器实例。
    例如:Map接口的 keySet() 方法返回该Map对象的Set视图,其中包含该Map中所有的键(Key),乍看之下,好像每次都调用keySet() 都应该创建一个新的Set实例,但是,对于一个给定的Map对象,实际上每次调用keySet() 都返回同样的Set实例。

    个人:keySet() 不需要创建多个实例,与其是否是适配器无关,而是因为它是视图(集合对象的再映射)的原因。只是可能视图大多数采用适配器的方式实现。若没有采用适配器模式,采用内部类实现Set接口。当该内部类对象非null时,则返回该对象。否同样可行。关键在于重用对象,与其是否为适配器无关。

    ③创建多余对象的方法:自动装箱

    自动装箱拆箱允许程序员将基本类型装箱类型混用,但是自动封箱拆箱容易使得基本类型和装箱类型之间的差别模糊起来。

    Long sum = 0L;
    
    for( long i = 0; i < Integer,MAX_VALU ; i++){
    
        sum += i;  //每次都构将一个Long实例(自动装箱)
    
    }
    
    System.out.println(sum);
    

    优先使用基本类型而不是装箱类型,当心无意识的自动装箱。当在一向操作中混用了基本类型和装箱类型时,装箱类型就会自动拆封。(Integer i, i==24 时会抛出NullPointerException异常,因为这里会对null对象进行自动拆箱)。

    相关文章

      网友评论

          本文标题:1.6:避免创建不必要的对象

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