避免创建重复的对象

来源:互联网 发布:知肤泉水光面膜价格 编辑:程序博客网 时间:2024/06/09 13:59

 如果一个类是非可变类 那么它总是可以被重用。

作为一个极端的反面例子,考虑下面的语句;

string s=new string(“silly”); 该语句每次被执行都创建一个String的实例。但是这些创建对象的动作没有一个是必须的。我们可以直接使用string s=“silly”代替;


除了重用非可变的对象之外,对于那些已知不会被修改的可变对象,你也可以重用他们,下面是一个比较微妙,也比较常见的反咧,其中涉及可变对象,它们的值一旦被计算出来之后就不会再有变化。

看看下面的例子说明:

package game.notchange;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person {

    private final Date birthDate;
    public Person(Date birthDate){
        this.birthDate=birthDate;
    }
    
    public boolean isBabyBoomer(){
        Calendar gmtCal=Calendar.getInstance(TimeZone.getTimeZone("GMT"));
         gmtCal.set(1946, Calendar.JANUARY,1,0,0,0);
         Date boomStart=gmtCal.getTime();
         gmtCal.set(1965, Calendar.JANUARY,1,0,0,0);
         Date boomEnd=gmtCal.getTime();
         return birthDate.compareTo(boomStart)>=0 && birthDate.compareTo(boomEnd)<0;
    }
}


isbabyboomer每次被调用的时候都会创建一个新的calendar对象,一个新的date对象和2个boomstart跟boomend实例。这个是不必要的,那么我们如何避免上面的例子呢。

package game.notchange;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class AnotherPerson {
    private final Date birthDate;
    
    public AnotherPerson(Date birthDate){
        this.birthDate=birthDate;
    }
    /**
     * the starting and ending dates of the body room
     */
    private static Date boom_start=null;
    private static Date boom_end=null;
    static{
        Calendar gmtCal=Calendar.getInstance(TimeZone.getTimeZone("GMT"));
         gmtCal.set(1946, Calendar.JANUARY,1,0,0,0);
         boom_start=gmtCal.getTime();
         gmtCal.set(1965, Calendar.JANUARY,1,0,0,0);
         boom_end=gmtCal.getTime();
    }
    public boolean isContaer(){
         return birthDate.compareTo(boom_start)>=0 && birthDate.compareTo(boom_end)<0;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}


很可能有人会问到 static final到底该怎么用 。

static 故名思议静态的 被static修士的成员变量跟成员方法独立于类的任何对象。也就是说,它不依赖于任何特定的类的实例,被类所有实例共享。只要这个类被加载。java虚拟机就能根据雷鸣在运行时数据区的方法去内找到他们。


static变量节省内存。对于静态变量在内存中只有一个拷贝。

static方法静态方法可以通过雷鸣调用,任何的实例也可以调用。因此静态方法中不能用this跟super关键字。

static代码块 叫做静态代码块 每个代码只会被执行一次。

1fianl变量:一旦定义 或者被初始化变不可改变。在这里的不可改变的意思对于基本类型来说是其值不可变,而对于对象变量来说其引用不可改变。

final 方法 不允许子类覆盖这个方法。

 第一 把方法锁定 防止修

 第二 搞笑。编译器在遇到final方法是会转入内嵌机制。

final 类

不能被继承,因此final类的成员方法没有机会覆盖,默认都是final的

原创粉丝点击